2010-06-06 2 views
0

이것은 처음으로 여기에 게시됩니다. 희망을 갖고 나 자신을 바보로 만들지 않을 것입니다.C : 포인터에 대한 포인터를 사용하여 메모리를 할당하기위한 적절한 구문

메모리에 포인터를 할당하고 버퍼에 텍스트를 복사 한 다음 문자를 변경하는 함수를 사용하려고합니다. 나는 계속 segfault를 얻고 답을 찾으려고 노력했다. 나의 구문은 틀렸고, 나는 깨달음을 사용할 수 있었다.

/* 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- 높은 precendence을 가지고, 그래서 인 것처럼 라인이 구문 분석 :

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

을 ... 당신이 원하는 바가 아니다. 당신은 실제로 * 먼저 일어날하려는, 그래서 당신은 괄호를 사용해야합니다

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

또한, 당신의 strncpy() 전화가 잘못되었습니다. strncpy() 복사 된 문자 수가 길이와 같으면 결과를 nul-terminate하지 않습니다. 그리고 메모리가 malloc()에서 바로 나오기 때문에 이미 거기에 널 종결자가없는 것 같습니다. strncpy()은 실제로 발생할 수있는 99.99 %의 사례에서 잘못된 도구입니다. 이유를 설명하는 수많은 답변이이 사이트에서 검색됩니다.

strncat()를 호출하는 대신 사용할 수 있습니다

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

고맙습니다. 다른 모든 사람들에게 동일합니다. :) – user359531

1

문제는 *Buffer[2]*(Buffer[2])을 의미 - 당신이 잘못된 포인터 역 참조하려고하고 있습니다. (*Buffer)[2]을 사용하고 싶습니다.

관련 문제