C - strcpy,malloc大小小于参数的大小

时间:2015-06-09 14:16:18

标签: c malloc strcpy

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。它与编译器有关还是标准的东西?

3 个答案:

答案 0 :(得分:1)

它被称为未定义的行为,因为它有时会起作用。是的,您可以在c中写入内存块,但这是非法的,因为它调用了未定义的行为,因此行为无法预测,您的程序可能会也可能不起作用。

您对strcpy()的期望不会发生,因为strcpy()复制了与'\0'终止字节之前找到的字符一样多的字符,它并不关心目标缓冲区是否很大够了,这是你必须要负责的事情。

如果你想复制一个确切的字节数(让我们说5 ),你可以使用

memcpy(p, "Hello, this string is very large but it doesn't matter", 5);

但要注意p之后不是有效字符串,因为它没有终止'\0'

你还有另外两种常见的坏习惯,即新的c程序员

  1. 您无需从malloc()转换返回值。

  2. 您无需使用sizeof(char),因为根据定义,它是1。

  3. 所以,

    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点之后。