为什么这个非常基本的C代码使用malloc崩溃?

时间:2014-02-04 10:34:30

标签: c malloc

我是C的新手。我正在努力确保我理解动态内存分配,所以我自己想出了一些例子。当我偶然发现这个时,我不确定为什么会崩溃。也就是说,我没有看到我们违反了什么。也许这里的高级C程序员之一可以向我解释。在我们将它指向某个地方后,我们能否操纵它?提前致谢。

int main(){

char *name = (char*)malloc(sizeof(char)*10);
name = "Hello";
name[0] = 'X'; //<------ bad idea?
puts(name); 
free(name);

char aname[sizeof(char)*10] = "Hello";
aname[0] = 'X';
puts(aname); 



return 0;
}

3 个答案:

答案 0 :(得分:6)

因为这都错了。

首先,don't cast the return value of malloc() in C。也不要按sizeof(char)缩放字符分配,这只是一种复杂的键入方式1,当然x * 1仍然只是x所以为什么不切入追逐。

其次,C不支持直接数组赋值,并且没有真正的字符串支持。

第三,不能修改文字字符串。

执行此操作时:

name = "Hello";  // Very bad idea, after malloc().
name[0] = 'X';   // Very bad idea, tries to modify the literal string.

使用不同的指针覆盖 malloc()返回的指针,即存储在某处的常量字符串的地址。然后尝试更改该常量字符串的第一个字符,这是不允许的。

应该是:

name = malloc(10);
snprintf(name, 10, "Hello");
name[0] = 'X';  // Perfectly fine, happens in memory from malloc().

这实际上使用了你分配的内存,这使得在将字符串复制到内存中之后你想做的任何修改都是有效的。

您可能还想检查malloc()是否失败,在这种情况下name将是NULL

答案 1 :(得分:1)

代码中的所有问题都有很好的解释,click here

工作代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(){

char *name = malloc(sizeof(char)*10);
if(name == NULL) {
    printf("Error allocating memory\n");
    return -1;
}
strcpy(name,"Hello");
name[0] = 'X'; 
puts(name); 
free(name);

char aname[sizeof(char)*10] = "Hello";
aname[0] = 'X';
puts(aname); 
return 0;

}

答案 2 :(得分:0)

您正在尝试更改字符串,字符串在现代编译器中以文字形式存储。如果要更改字符串,请改用数组。

String将存储为文字,但由于它是char数组,它将在堆栈上存储单独的字符。

char arr[]= "Hello"; //Hello is stored as literal.

但是arr [0]会有'H'..