簡體   English   中英

更改C中指針字符串數組的值

[英]Change value in pointer string array in 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行,你仍然會有這個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);

這取決於。 如果指針指向字符串文字則不能。 如果它是一個字符數組,那么它是可能的。

在給出的代碼片段中,您使用mallocword分配了內存,然后您將字符串文字分配給word ,使該word指向Test第一個字符,並且之前分配的內存不再被它指向並且它將導致內存泄漏。 在這種情況下,您無法通過word[2] = 'w';修改Test word[2] = 'w'; 它將調用未定義的行為。

而不是word = "Test"; ,使用strcpy復制字符串

strcpy(word, "Test");  

您的代碼段應該看起來更像這樣:

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

return 0;

1)指針'word'正在被替換。 這會導致內存泄漏

2)文字處於只讀內存中,因此嘗試更改該內存中的任何內容都會導致seg錯誤事件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM