为什么它不返回分段错误11?
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
char *test;
test = (char*) (malloc(sizeof(char)*3));
test = "foo";
printf("%s\n", test);
test = "foobar";
printf("%s\n", test);
return 0;
}
我的结果是
foo
foobar
我对C还是很陌生,但是当我同时在Mac上使用gcc和Windows 10上的Windows Debugger进行编译时,它并没有像我预期的那样崩溃。
我的理解是,通过使用(char*) (malloc(sizeof(char)*3))
,我将创建一个长度为3的字符数组。然后,当将test分配给字符串foobar时,我将写入6个数组位置。
我只是坐在这里,盯着我看似有效,可运行的代码,挠了我的头。
答案 0 :(得分:5)
test = "foo";
这里您没有将字符串复制到分配的内存中,test
不再指向分配的内存,而是指向了字符串文字"foo"
。 "foobar"
也是如此。另外,正如注释中指出的那样,分配的内存的地址丢失了,因此是内存泄漏(因为没有办法检索内存的地址)。
如果要将字符串复制到另一个目标,则需要使用strcpy
或遍历每个字符。
如果您写入或读取分配空间的边界,则会调用未定义的行为。这意味着基本上所有事情都可以发生,而且可以正常工作。
答案 1 :(得分:2)
您的程序永远不会写入malloc()
返回所指向的位置。您所做的一切,例如test = "foo";
是test
所指向的更改,顺便说一句是内存泄漏,因为您丢失了malloc()
返回的内容。
要正确使用为malloc()
分配的内存,请使用strcpy()
,snprintf()
等。
此外,不要忘记C字符串中的空终止符。正确存放例如“ foobar”至少需要7个字节,而不是6个字节。
答案 2 :(得分:-1)
第一件事是,通过将foo
的地址存储到其中而不必要地浪费了malloc分配的内存。
如果要在代码部分中指向字符串,则无需为指针分配内存。
何时将内存分配给指针 例如当您打算从指针中的键盘扫描“ n”个字节时。
char *ptr,num_char;
scanf("%d",&num_char);
ptr = (char *)malloc(num_char*sizeof(char));
scanf("%s",ptr);