我是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;
}
答案 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'..