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



我是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;
}

因为这全是错误的。

首先,不要在C中施放malloc()的返回值。也不要按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.

you 覆盖 malloc()返回的指针带有不同的指针,即存储在某个地方的常数字符串的地址。然后,您尝试更改不允许的恒定字符串的第一个字符。

应该是:

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

这实际上使用了您分配的内存,这使您在将字符串复制到内存之后要进行的任何修改都如有效。

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

您的代码中所有问题都有很好的解释,请单击此处。

工作代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(){
char *name = malloc(sizeof(char)*10);
if(name == NULL) {
    printf("Error allocating memoryn");
    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;
}

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

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

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

但是ARR [0]将具有'H'..

相关内容

  • 没有找到相关文章

最新更新