malloc 的值需要强转,改成这个
str = (char*)malloc(sizeof(char)*len);
malloc 返回的指针是void类型的,因为它只负责申请内存,具体你到底要用什么类型的指针来指向它它是不管的
但是如果你保持void类型不变,它的步长是0,后续是没法用的
你需要强制转换成自己指针的类型
1、在不知道变量需要的确定内存时
比如在定义一个数组时,数组的大小在程序编译后才知道,这时可以用malloc函数
int main()
{
int n;
scanf("%d",&n);
int *m=(int *)malloc(sizeof(int)*n); //定义了一个指向n个int的 指针变量,相当于开了一个n个int元素的数组。
//如果n很大,超过1000000,那么开一个这么大的int型数组就会发生栈溢出。
int m[1000000]; //会发生栈溢出。
return 0;
}
2、为结构体变量分配空间。
定义一个结构体类型的普通变量,可以不malloc动态申请内存,CPU会为结构体变量分配内存 。
typedef struct
{
int n;
char *p;
}node;
int main()
{
node a; //定义的是结构体普通变量,可以不使用malloc申请内存,CPU会为这个结构体变量分配内存
a.n=4;
printf("%d",a->n); //可以成功输出
node *b; //定义的是结构体指针变量,CPU会为这个指针开辟内存,大小为4个字节。但是要存储结构体的数据成员这个空间不够,会引发段错误,此时必须要malloc申请一个结构体类型大小的动态内存,存储数据成员。
//b=(node *)malloc(sizeof(node));
printf("%d",sizeof(b)); //用sizeof(b)查看b的大小为4
char p[]="abcd";
printf("%d",b->n);
(a->p)=p;
printf("%c",a->p[0]);
return 0;
}
没有使用malloc为结构体指针变量b分配空间,会报warning: ‘b’ is used uninitialized in this function [-Wuninitialized]|。
3、在定义结构体时需要注意,要依次为其成员分配空间。
在平常使用过程中,在用malloc函数为某个结构体分配空间后,在对其成员变量(指针类型)进行操作。
比如 令该指针 p=NULL时,总会报“Program received signal SIGSEGV, Segmentation fault."
使用malloc函数