更改C中指针字符串数组的值

时间:2015-04-29 14:29:51

标签: c arrays string pointers malloc

是否可以通过这种方式更改由字符串指针初始化的字符数组中的值:

char *word;
word = (char*) malloc(10 * sizeof(char));
word = "Test";
word[2] = 'w';

return 0;

执行上述代码时出现分段错误。

5 个答案:

答案 0 :(得分:1)

第1点

您不会在malloc()之后分配字符串。否则,你会泄漏记忆。请改用strcpy()

另外,请do not cast malloc()和家人的返回值。

第2点

[没有malloc()] 字符串文字(此处,"Test")通常存储在只读内存中。尝试更改它们将调用undefined behaviour

参考:根据C11标准,章节§6.4.5,字符串文字,(强调我的)

  

如果这些数组的元素具有适当的值,则未指定这些数组是否相同。 如果程序试图修改此类数组,则行为未定义。

在你的代码中,

word[2] = 'w';

正在尝试更改字符串文字。而分割错误是UB的副作用之一。

答案 1 :(得分:1)

您的代码中存在许多问题。

  • 你应never cast the result of malloc,因为这样做毫无意义且有潜在危险。
  • 在C中,您使用strcpy()复制字符串,而不是使用赋值运算符=。
  • 由于你从未复制过该字符串,只是告诉指针指向其他地方,因此造成了内存泄漏。
  • 由于您从未复制过字符串,而只是指向字符串文字,因此您会调用未定义的行为,因为您尝试修改字符串文字的内容。 (删除malloc行,你仍然会有这个bug。)
  • 您似乎没有释放()内存,也没有检查malloc的返回值。

正确的代码:

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)

这取决于。如果指针指向字符串文字,则不能。如果它是一个字符数组,那么它是可能的。

在给出的代码段中,您使用wordmalloc分配了内存,然后您将字符串文字分配给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故障事件