malloc在函数内分配内存问题

malloc函数用法可参考:C语言中 malloc函数用法

代码:

void fun(char * p)
{
    p=(char *)malloc(100);
}

void main()
{
    char *p;
    fun(p);
    char s[]="hello world";
    strcpy(p,s);
    cout<<p<<endl;
}

找出代码错误之处。

不能通过这样的方式申请动态内存,申请的内存首地址无法通过形参传递出去(形参只做实参的值复制)。

VS2010下运行,出现错误:Run-Time Check Failure #3 - The variable ‘p‘ is being used without being initialized.

将main函数中 char *p; 修改为 char *p=NULL; 依旧是错误的。

【XXXXX中的 0x100cd2e9 (msvcr100d.dll) 处有未经处理的异常: 0xC0000005: 写入位置 0x00000000 时发生访问冲突】

要正确申请动态内存,可将程序修改为:

void main()
{
    char *p;//char *p=NULL;
    p=(char *)malloc(100);
    char s[]="hello world";
    strcpy(p,s);
    cout<<p<<endl;    free(p);
}

原文地址:https://www.cnblogs.com/Tang-tangt/p/9338844.html

时间: 2024-10-08 22:58:08

malloc在函数内分配内存问题的相关文章

通过指针子函数中分配内存,在主函数中实现赋值

实现了在子函数中分配内存,在主函数中实现赋值或对其值的修改. 原文地址:https://www.cnblogs.com/jefy/p/9383899.html

Dalvik虚拟机为新创建对象分配内存的过程分析

在前面一文中,我们分析了Dalvik虚拟机创建Java堆的过程.有了Java堆之后,Dalvik虚拟机就可以在上面为对象分配内存了.在Java堆为对象分配内存需要解决内存碎片和内存不足两个问题.要解决内存碎片问题,就要找到一块大小最合适的空闲内存分配给对象使用.而内存不足有可能是内存配额用完引起的,也有可能是垃圾没有及时回收引起的,要区别对待.本文就详细分析Dalvik虚拟机是如何解决这些问题的. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! 内存碎片问

ART运行时为新创建对象分配内存的过程分析

ART运行时和Dalvik虚拟机一样,在堆上为对象分配内存时都要解决内存碎片和内存不足问题.内存碎片问题可以使用dlmalloc技术解决.内存不足问题则通过垃圾回收和在允许范围内增长堆大小解决.由于垃圾回收会影响程序,因此ART运行时采用力度从小到大的进垃圾回收策略.一旦力度小的垃圾回收执行过后能满足分配要求,那就不需要进行力度大的垃圾回收了.本文就详细分析ART运行时在堆上为对象分配内存的过程. 本博参加博客之星评选,求投票:点击投票 老罗的新浪微博:http://weibo.com/shen

变量声明有没有分配内存?

Q1: int i 这个有没有分配内存呢? int *p 呢? 具体是在栈空间还是在堆空间里分配内存呢? ? A1: int i; int *p; 这两个都在栈区分配了内存空间 但是p指向的地址为野地址,不可直接拿来使用 即p指向的空间没有分配 ? Q2:在Java中定义数组时必须分配内存,这句话是错的还是对的呢 ? A2: Java中的数组你可以看到一个特殊的对象,声明时是放在栈中的,分配的空间存储在堆中 如: 1. int[] arr = null; 此时只是在栈中声明了一个 arr 数组,

45.切割字符串并精确分配内存

运行结果: 源代码: 1 #define _CRT_SECURE_NO_WARNINGS 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <string.h> 5 6 //根据')'数量判断数据有多少行 7 int getcharnum(char *str, char ch) 8 { 9 int num = 0; 10 //strchr返回第一个找到的地址 11 char *p = strchr(str, ch

malloc函数分配内存失败的常见原因

malloc()函数分配内存失败的常见原因:  1. 内存不足.  2. 在前面的程序中出现了内存的越界访问,导致malloc()分配函数所涉及的一些信息被破坏.下次再使用malloc()函数申请内存就会失败,返回空指针NULL(0). malloc中做了哪些事情: 简单的说就是系统中有一个位置标记,标记了 当前已经用掉的内存用到了什么位置,系统中还有一个链表把各个未用的内存块连接起来,申请新内存的时候就未分配的链表中依次查找一个够用的内存块,把这次分配的内存地址返回给用户,把这次用掉的进行映射

C++ 内存、new与malloc分配内存区别?

一关于内存 1.内存分配方式 内存分配方式有三种: (1)从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. (2)在栈上创建.在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. (3) 从堆上分配,亦称动态内存分配.程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或de

分配内存malloc和free()

所有的程序都必须留出足够的内存来存储它们使用的数据.一些内存分配是自动完成的.在运行时需要分配更多的内存.主要的工具是函数malloc(),它接受一个参数:所需要内存字节数.然后malloc找到可用内存中一个大小合适的块.内存是匿名的:也就是说,malloc()分配了内存,但没有为它指定名字.然而,它却可以返回那块内存第一个字节的地址.因此,可以把那个地址赋值给一个指针变量,并使用该指针来访问那块内存. char place[] = "Dancing Oxen Creek"; 因为ch

数据结构-c语言内的内存分配

常用到的数据存储区: 在C语言中,根据数据在内存中存在的时间(生存期)不同,将内存空间分为三个区: 1.程序区:用于存储程序的代码,即程序的二进制代码: 2.静态存储区:用于存储全局变量和静态变量,这些变量的空间在程序编译时就已经分配好了: 3.动态存储区:用于在程序执行时分配的内存,又分为:堆区(heap)和堆栈区(stack)两种. 堆区:用于动态内存分配,程序运行时由内存分配函数在堆上分配内存.在C语言中,只要使用指针才能动态的分配内存. 堆栈区:在函数执行时,函数内部的局部变量和函数参数