是否可以通过这种方式更改由字符串指针初始化的字符数组中的值:
char *word;
word = (char*) malloc(10 * sizeof(char));
word = "Test";
word[2] = 'w';
return 0;
执行上述代码时出现分段错误。
答案 0 :(得分:1)
第1点
您不会在malloc()
之后分配字符串。否则,你会泄漏记忆。请改用strcpy()
。
另外,请do not cast malloc()
和家人的返回值。
第2点
[没有malloc()
] 字符串文字(此处,"Test"
)通常存储在只读内存中。尝试更改它们将调用undefined behaviour。
参考:根据C11
标准,章节§6.4.5,字符串文字,(强调我的)
如果这些数组的元素具有适当的值,则未指定这些数组是否相同。 如果程序试图修改此类数组,则行为未定义。
在你的代码中,
word[2] = 'w';
正在尝试更改字符串文字。而分割错误是UB的副作用之一。
答案 1 :(得分:1)
您的代码中存在许多问题。
正确的代码:
char* word;
word = malloc(10);
if(word == NULL)
{
// out of memory, error handling here
}
strcpy(word, "Test");
word[2] = 'w'; // should give "Tewt"
...
free(word);
答案 2 :(得分:0)
这取决于。如果指针指向字符串文字,则不能。如果它是一个字符数组,那么它是可能的。
在给出的代码段中,您使用word
为malloc
分配了内存,然后您将字符串文字分配给word
,让word
指向第一个字符Test
以及先前分配的内存不再被它指向,它将导致内存泄漏。在这种情况下,您无法通过Test
修改word[2] = 'w';
。它将调用未定义的行为。
使用word = "Test";
复制字符串
strcpy
strcpy(word, "Test");
答案 3 :(得分:0)
您的代码段应该看起来更像这样:
int maxlen = 10;
char *word;
word = malloc(maxlen * sizeof(char));
strncpy(word, "Test", maxlen);
word[2] = 'w';
return 0;
答案 4 :(得分:0)
1)指针是' word'正在被取代。 这会导致内存泄漏
2)文字是只读内存, 因此,尝试更改该内存中的任何内容都会导致seg故障事件