是否可以通过以下方式更改由字符串指针初始化的字符数组中的值:
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;
这取决于。如果指针指向字符串文字,则不能。如果它是一个字符数组,那么这是可能的。
在给定的代码段中,您使用malloc
为word
分配了内存,然后将字符串文本分配给word
,这让word
指向Test
的第一个字符,并且先前分配的内存不再由它指向,这将导致内存泄漏。在这种情况下,您无法通过 word[2] = 'w';
修改Test
。它将调用未定义的行为。
代替word = "Test";
,使用 strcpy
复制字符串
strcpy(word, "Test");
1)指针是"单词"正在被替换。 这会导致内存泄漏
2) 文字在只读内存中,因此,尝试更改该内存中的任何内容都会导致 SEG 故障事件