我是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'..