我有一个简单的C程序,关于分配char指针和malloc,就像这个一样
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char str[] = "0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789";
char* str1 = malloc(sizeof(char*));
strcpy(str1, str);
printf("%snn", str1);
char* str2 = malloc(sizeof(char*));
str2 = str1;
printf("%sn", str2);
return 0;
}
结果是:
0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789
0123456789 0123456789 01!
那么,为什么str2只从str1中获得25个字符呢?"!"(str2末尾)从哪里来?
你能帮我吗?谢谢
您没有分配足够的空间。sizeof(char *)
是保存指针所需的内存量(与指针指向的位置无关)。
将两个malloc都更改为:malloc(sizeof str)
或malloc(strlen(str) + 1)
。
此外,str2 = str1
会导致内存泄漏。它使指针str2
指向str1
所指向的位置,然后您就得到了malloc’d块,而没有任何指针指向它
在您的原始代码中,当您将不属于自己的内容写入内存时,任何事情都可能发生;尝试并调查为什么你会得到一些特定的垃圾而不是其他特定的垃圾,这并没有真正的用处。
您的sizeof
是错误的,您是malloc
,根据您的指针大小,您应该是malloc(sizeof(str)
,因为这就是您要复制到其中的内容。
另外,请注意,str2 = str1
只是覆盖了str2
指针,因此内存泄漏,因为str2
初始化中的malloc
丢失了。