2012-04-11 6 views
1

memset에 정적으로 할당 된 문자 배열을 시도 할 때 segfault가 발생하지만 malloc을 사용하여 할당 된 동일한 길이의 배열에는 그렇지 않습니다.정적으로 할당 된 char 배열에 대한 C - memset segfault

변수 정의 :

//static 
    char inBuff[IN_BUFF_LEN]; 
    //dynamic 
    char * inBuffD; 

함수 호출 : 함수 내

//static, cast used because char** != char (*) [n] 
    serverInit(portNum, (char**) &inBuff, &serv_addr, &sockfd) 
    //dynamic 
    serverInit(portNum, &inBuffD, &serv_addr, &sockfd) 

사용 :

memset(*inBuffAdr, 0, IN_BUFF_LEN); 

나는 나의 문제는 함수 호출의 차이에 있음을 의심 또는 더 정확하게, "char **! = char (*) [n]"상황에 대한 나의 불완전한 이해. 그러나 나는 이것에 너무 오래 동안 부딪 치고 나무에서 숲을 볼 수 없다 그래서 어떤 힌트 및 통고든지 아주 평가 될 것입니다.

+1

'inBuffAdr' 란 무엇이며 어떻게 설정합니까? – NPE

+0

다른 곳에서 사용되는 구조 일 뿐이며 현재의 질문에는 중요하지 않습니다. 하지만 만약 당신이 정말로 내가 당신에게 몇 가지 세부 사항을 줄 수 있다는 것을 알고 싶다면 – Zodd

답변

4

그냥 inBuff (안 ** inBuff) 다음 memset 함수 inBuffAdr를 보내고 * inBufAdr이 (다른 memset 함수는 아마 중 하나를 작동하지 않습니다, 당신은 아직 모른다)하지 방법 :

serverInit(...., char * inBuff, ....) 

다음과 같이 serverInit() 전화 memset() 내부에 다음

serverInit(...., inBuff, ....) 

하고 그것을 전화 :

memset(inBuff, 0, IN_BUFF_LEN); 
+2

+1 "일하지도 않지만, 아직 모릅니다." –

+0

나는 함수 밖에서 포인터 변수를 갖기 위해 노력하고 있었지만 필요하다면 그 값을 설정할 수있다. 따라서 이중 포인터. 다른 memset에 관해서는 지금 당장 일하고있는 것처럼 보이지만 나는 당신이 의미하는 것을 안다. :) – Zodd

0

왜 다음을 serverInit()을 정의하지

1

serverInit() 함수에 이중 포인터를 전달해야합니까? 함수가 포인터가 가리키는 위치를 수정할 수 있으면 정적으로 할당 된 배열을 전달할 수 없습니다. 함수가 포인터가 가리키는 위치를 수정할 수 없으면 이중 포인터가 필요하지 않습니다.

&inBuff의 유형은 IN_BUFF_LENchar의 배열에 대한 포인터이며 char **과는 완전히 다릅니다. 컴파일러를 불평하지 않고, 컴파일러보다 자신이하는 일을 잘 알고 있다고 주장했습니다. 컴파일러 이상을 알고 있다고 확신하지 않는 이상 캐스트를 사용하지 마십시오. 그러나

//static 
char inBuff[IN_BUFF_LEN]; 
char *inBuffS = inBuff; 
//dynamic 
char *inBuffD; 

serverInit(portNum, &inBuffS, &serv_addr, &sockfd); 

, 내가 두 번째위한 간단한 char * 대신 char **의를 취할 serverInit()을 개정해야한다고 깊이 의심 해요 :

는 솔직히 현재 프로토 타입 주어, 당신은 아마와 함께 가장 좋은 선택이 될 것입니다 논의.

+0

'char **'는 아마도 코멘트에 틀렸다고 말하기 시작했는데 너도 나를 때렸다. 배열의 크기 정보를 배열로 가지고 다니는 것이 좋은 경우가 아니라면 배열의 크기 정보를 배열로 옮기는 것이 좋다고 덧붙입니다. 즉, 프로토 타입을'serverInit (short port, char * buf, size_t bufsize, struct sockaddr * addr, int * fd)'로 변경하십시오. 그리고 실제로, 나는 fd가 포인터가 될 필요성에 의문을 제기합니다. –

+0

@BrianMcFarland : 나는 당신이 말하는 것에 동의합니다. 'serverInit()'함수가'fd'를 열고 그것을 호출 코드로 반환하면, 포인터는 어느 정도 정당화됩니다. 그러나 이와 같은 반환 매개 변수가 여러 개인 경우 구조에 모두 넣을 가치가 있으며 함수는 구조에 대한 포인터 만 가져 와서 적절하게 세부 정보를 채 웁니다. 문제의 한 가지 문제는 도움이되는 답변을 만들 수있는 문맥이 거의 없다는 것입니다. –

+0

이전 주석에서 언급했듯이 이중 포인터는 함수 내에서 포인터의 값을 변경하여 값을 전달하면이를 잘라 내지 못하기 때문에 가능합니다. @JonathanLeffler 이는 여러 개의 반환 값입니다. 나는 그것들을 구조체에 넣을 것이다. 그러나 이것은 기본적으로 최종 함수의 모형이다. 먼저 그것을 작동시키고 나중에 그것을 마무리하겠습니다. 문맥에 관해서는, 내가 게시 한 코드 주위에 훨씬 더 많은 코드가 없으며 적어도 inBuffAdr 값과 상호 작용하는 코드는 없습니다. – Zodd

0

&inBuffinBuff을 얻기 위해 역 참조 할 수 있다고 생각하는 부분이 있습니다. 이 간단한 테스트 프로그램을 실행하는 경우 :

#include <stdio.h> 
char inBuff[1000]; 
int main(int argc, char *argv[]) 
{ 
    printf("%p %p\n", inBuff, &inBuff); 
    return 0; 
} 

두 표기법 모두에 대해 동일한 주소가 인쇄됩니다. &inBuff을 참조 해제하려고하면 배열의 처음 몇 바이트를 주소로 사용하게됩니다.

다른 사람들이 언급했듯이, 설정하려는 메모리에 대한 포인터 만 전달하면됩니다.다행히도이 대답은 앞으로의 디버깅 세션에 도움이되기를 바랍니다.