为什么malloc似乎允许我通过内存进行写操作?

时间:2018-08-31 02:35:09

标签: c arrays malloc

为什么它不返回分段错误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个数组位置。

我只是坐在这里,盯着我看似有效,可运行的代码,挠了我的头。

3 个答案:

答案 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);