char* init_array()
{
const int size = 5;
char *p = (char*) malloc(size * sizeof(char));
strcpy(p, "Hello, world! How are you?");
return p;
}
size = 5,malloc应该从内存中获得5个自由字符,但是给定字符串不适合5个字符,但它可以工作。
我的问题是为什么?首先我认为结果会被截断,但p是完全字符串,而不仅仅是“Hello”或“Hell \ 0”
我在Linux上使用GCC。它与编译器有关还是标准的东西?
答案 0 :(得分:1)
它被称为未定义的行为,因为它有时会起作用。是的,您可以在c中写入内存块,但这是非法的,因为它调用了未定义的行为,因此行为无法预测,您的程序可能会也可能不起作用。
您对strcpy()
的期望不会发生,因为strcpy()
复制了与'\0'
终止字节之前找到的字符一样多的字符,它并不关心目标缓冲区是否很大够了,这是你必须要负责的事情。
如果你想复制一个确切的字节数(让我们说5 ),你可以使用
memcpy(p, "Hello, this string is very large but it doesn't matter", 5);
但要注意p
之后不是有效字符串,因为它没有终止'\0'
。
你还有另外两种常见的坏习惯,即新的c程序员
您无需从malloc()
转换返回值。
您无需使用sizeof(char)
,因为根据定义,它是1。
所以,
p = malloc(size);
应该足以为size - 1
个字符串分配空间。
答案 1 :(得分:0)
您遇到的是buffer overflow
简而言之,您写入调用Undefined Behavior的无效内存地址。任何事情都可能发生。
答案 2 :(得分:0)
它似乎有效,但事实上你的代码调用了未定义的行为。您正在将数据写入未分配的内存位置。
你应该注意到
strcpy(str1, str2);
strcpy
无法检查str2
指向的字符串是否适合字符数组str1
。在您的情况下,它会继续将字符从"Hello, world! How are you?
复制到数组p
点之后。