2010-06-06 116 views
0

這是我第一次在這裏發佈,希望我不會愚弄自己。C:正確的語法分配內存使用指針指針

我想使用一個函數來分配內存到指針,將文本複製到緩衝區,然後更改一個字符。我不斷收到段錯誤,並試圖查找答案,我的語法可能是錯誤的,我可以使用一些啓發。

/* My objective is to pass a buffer to my Copy function, allocate room, and copy text to it. Then I want to modify the text and print it.*/ 

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int Copy(char **Buffer, char *Text); 

int main() 
{ 
char *Text = malloc(sizeof(char) * 100); 
char *Buffer; 

strncpy(Text, "1234567890\n", 100); 

Copy(&Buffer, Text); 
} 

int Copy(char **Buffer, char *Text) 
{ 
int count; 

count = strlen(Text)+1; 

*Buffer = malloc(sizeof(char) * count); 

strncpy(*Buffer, Text, 5); 

*Buffer[2] = 'A'; /* This results in a segfault. "*Buffer[1] = 'A';" results in no differece in the output. */ 

printf("%s\n", *Buffer); 

} 

回答

1

*Buffer[2]是越來越理解爲*(Buffer[2])。你想要的是(*Buffer)[2]

2

你的問題只是一個優先。該[]經營者有優先級數字是unary- *,所以行被解析,如果它是:

*(Buffer[2]) = 'A'; 

...這是不是你想要的。你真正想要的*先發生,所以你需要使用括號:

(*Buffer)[2] = 'A'; 

此外,您的通話strncpy()是錯誤的。如果複製的字符數等於長度,則strncpy()不會終止結果;並且由於你的記憶直接來自malloc(),所以那裏可能沒有終結者。 strncpy()實際上是您遇到的99.99%的案例中的錯誤工具 - 在本網站上搜索許多其他解釋原因的答案。

strncat()的呼叫可以用來代替:

(*Buffer)[0] = '\0'; /* Truncate to an empty string */ 
strncat(*Buffer, Text, 5); 
+0

非常感謝! 和其他人一樣。 :) – user359531 2010-06-06 05:15:24

1

的問題是,*Buffer[2]意味着*(Buffer[2]) - 你試圖取消引用了錯誤的指針。你想使用(*Buffer)[2]