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



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

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

我在执行上述代码时遇到分段错误。

你得到一个崩溃,因为你这样做:

word = "Test";
word[2] = 'w';

第一个赋值更改指针,因此它不再指向已分配的内存,而是指向字符串文本。字符串文字实际上是只读字符数组。由于它们是只读的,因此您在第二个赋值中修改数组的尝试将导致未定义的行为

正确的方法是将字符串复制到您分配的内存中,您可以使用 strcpy 函数执行此操作:

strcpy(word, "test");

重新分配指针

的另一件事是,然后您将指针松散到分配的内存,并出现内存泄漏。您也不能在指针上调用free,因为word指向的内存(在原始重新分配之后)不再由您分配,这将导致另一种未定义行为的情况。

1 点

不要在 malloc() 之后分配字符串。否则,您将泄漏内存。请改用strcpy()

另外,请不要强制转换malloc()和 family 的返回值。

要点 2

[不带malloc()]字符串文字(此处为"Test")通常存储在只读内存中。试图改变它们将引发未定义的行为。

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

如果这些数组

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

在您的代码中,

word[2] = 'w';

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

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

  • 您永远不应该投射 malloc 的结果,因为这样做毫无意义且具有潜在危险。
  • 在 C 中,您可以使用 strcpy() 复制字符串,而不是使用赋值运算符 = 复制字符串。
  • 由于您从未复制过字符串,而只是告诉指针指向其他地方,因此您创建了内存泄漏。
  • 由于您从未复制过字符串,而只是指向字符串文本,因此您调用未定义的行为,因为您尝试修改字符串文本的内容。(删除 malloc 行,您仍然会遇到此错误。
  • 您似乎没有释放()内存,也没有检查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);

你的代码片段可能看起来更像这样:

int maxlen = 10;
char *word;
word = malloc(maxlen * sizeof(char));
strncpy(word, "Test", maxlen);
word[2] = 'w';
return 0;

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

在给定的代码段中,您使用mallocword分配了内存,然后将字符串文本分配给word,这让word指向Test的第一个字符,并且先前分配的内存不再由它指向,这将导致内存泄漏。在这种情况下,您无法通过 word[2] = 'w'; 修改Test。它将调用未定义的行为。

代替word = "Test";,使用 strcpy 复制字符串

strcpy(word, "Test");  

1)指针是"单词"正在被替换。 这会导致内存泄漏

2) 文字在只读内存中,因此,尝试更改该内存中的任何内容都会导致 SEG 故障事件

相关内容

  • 没有找到相关文章

最新更新