我有一个关于指定char指针和malloc的简单C程序,如此
#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("%s\n\n", str1);
char* str2 = malloc(sizeof(char*));
str2 = str1;
printf("%s\n", str2);
return 0;
}
结果是:
0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789 0123456789
0123456789 0123456789 01!
那么为什么str2只能从str1获得25个字符?那里的“!” (在str2的最后)来自?
你可以帮帮我吗? 谢谢!答案 0 :(得分:2)
你没有足够的空间。 sizeof(char *)
是保存指针所需的内存量(与指针指向的位置无关)。
将mallocs更改为:malloc(sizeof str)
或malloc(strlen(str) + 1)
。
此外,str2 = str1
会导致内存泄漏。它使指针str2
指向str1
指向的位置,然后你就拥有那个没有任何指向它的malloc&#d; d块。
在原始代码中,当你写入你不拥有的记忆时,任何事情都可能发生;尝试调查为什么你得到一些特定的垃圾而不是其他一些特殊的垃圾并不是真的有用。
答案 1 :(得分:1)
你的sizeof
错了,你是malloc
- 4或8个字节,根据你的指针大小,你应该malloc(sizeof(str)
,因为那是你要复制到它里面的东西
另请注意,str2 = str1
只会覆盖str2
指针,因此您的内容会出现内存泄漏,因为malloc
初始化中的str2
会丢失。