2013-12-17 6 views
2

두 개의 함수를 사용하여 문자열 배열을 채우고 싶습니다. 할당 할 문자열이 n 개 있으면 n 개의 메모리 공간을 할당합니다. 여기문자열 배열에 메모리 할당

char** allocate(int n) 
{ 
    char** t; 
    t=(char**)malloc(n*sizeof(char*)); 
    if(!t) exit(-1); 
    return t; 
} 

이 두 번째입니다 :

void fill(char*** t,int n) 
    { 
     int i; 
     char* help=" "; 
     for(i=0;i<n;i++) 
     { 
      printf("\n saisir la chaine n %d :",i+1); 
       scanf("%s",help); 
       *t[i]=(char*)malloc((strlen(help)+1)*sizeof(char)); 
       strcpy(*t[i],help); 
     } 
    } 

내가 main에서 두 번째 하나를 호출하는 것을 잊지 않았다 각 문자열에 대한 메모리를 할당합니다 두 번째는 여기

는 첫 번째 함수 읽기 다음과 같이하십시오 : fill(&t,n);

문제는 첫 번째 문자열을 읽은 후 오류가 발생하여 프로그램이 끝나는 것입니다.

+3

'char * help = ""; – this

+0

확장하려면'scanf ("% s", help)를 호출 할 때'help'는 충분히 큰 메모리 위치를 가리켜 야합니다 –

+1

C에서'malloc'의 결과를 캐스팅 할 필요가 없습니다. – dasblinkenlight

답변

0

문제는 메모리에 도움말 변수를 할당하지 않는다는 것입니다.

변경 char* help=" ";char help[512]="";

(리터럴 문자열 상수에 도움이 포인트가 변경 될 수 없습니다 메모리 블록에 저장이 방법에.

+0

그게 효과가 : 고맙습니다. –

+1

@ user3104033 : 511 자 이상을 입력하면 할당 된 메모리가 덮어 쓰여지고 정의되지 않은 동작이 발생하여 프로그램이 다시 실패하게됩니다. – alk

0

fill()은 단지 char * *이어야한다고 생각합니다. 운영자 우선 순위 문제가 발생한다고 생각합니다.

fill() 안에 배열을 다시 할당 할 필요가 없으므로 3 단계 간접 참조가 필요하지 않습니다. 그냥 2로 변경해야하며 물론 &이 없어도 호출해야합니다.

+0

당신이 말했듯이, 나는 char **을 가져 갔고 char * help = ""; char aide [] = ""; 이제 프로그램에서 모든 문자열을 묻습니다. 그러나이 오류와 함께 마지막 문자열을 작성한 후에 문제가 발생합니다 : "변수 'aide'주위의 스택이 손상되었습니다." –

+0

't'가'char ** t'로 선언되고 그는이 변수의 주소를'fill (& t, n)'으로 전달하고,'char *** t '선언은 꽤 정확했다. 나는 여기에 게시 된 코드에서 추가 수준의 간접 지정이 필요 없다는 것에 동의하며, 't'가 다시 할당되지 않으면 불필요한 리디렉션 수준을 제거하는 것이 좋습니다. –

2

이 줄

char* help=" "; 

은 정의 " "을 가리키는 포인터

할당 된 메모리가 없습니다. 스캔 할 데이터를 scanf()을 통해 저장하십시오. 당신은 문자의 최대를 스캔해야하는 경우에는 다음과 같이

을 수행


#define SCAN_MAXIMUM (255) 
#define SCAN_FMT_STRINGIFY(max) "%"#max"s" 
#define SCAN_FMT(max) SCAN_FMT_STRINGIFY(max) 

... 

    char help[SCAN_MAXIMUM + 1]; /* Add one for the road^H^H^H^H`0`-terminator. */ 
    scanf(SCAN_FMT(SCAN_MAXIMUM), help); 
는 또한이 라인이 원하지 않는 것을 :

*t[i]=(char*)malloc((strlen(help)+1)*sizeof(char)); 
    strcpy(*t[i],help); 

[] 운영자 바인드를 더 가깝게는 * 연산자이므로 줄이 같아야합니다.

(*t)[i] = malloc((strlen(help) + 1)); 
    strcpy((*t)[i], help); 

^2 : malloc/calloc/realloc의 결과를 캐스팅 할 필요가 없으며 권장 사항이 아닙니다.


도^3 sizeof(char)하는 1 동일한 것으로 정의된다.