2014-12-15 9 views
0

문자 배열에 대한 포인터 인 char**을 반환하는 함수가 있습니다. 여기서는 특정 정수 값 ind에 대한 디렉토리 수의 파일을 읽습니다. 파일에서 값을 찾으면 디렉토리의 이름을 반환해야합니다. 나는 정적 할당을 사용하여 시도했지만 그 변수를 반환하면 정의되지 않은 동작이 발생하므로 도움이되지 않습니다. 필자의 경우에는 마지막 디렉토리 이름과 같은 모든 값을 얻습니다. 이것은 할당 된 시스템 스택에서 읽는 중이기 때문에 발생합니다. 그때 동적 할당을 사용하고 여기에 내가 작성한 코드입니다 :문자열 포인터를 반환하는 함수

int i = 0; 
char **array; 
array = get_strings(1); 
for(i=0;i< found;i++) 
    printf("array[%d] = %s\n", i, array[i]); 

내가 출력에 쓰레기 값을 얻을 :

//Global variable 
int found = 0; 

char** get_strings(int ind) 
{ 
FILE *fp; 
char filename[64]; 
char name[16]; 
//char *name; 
char **array; 
int i = 0, found = 0, l = 0; 
int val = 0; 

    char **array = (char **)malloc(10 * sizeof(char *)); 
for(l = 0; l < 10; l++) 
    array[l] = (char *)malloc(16 * sizeof(char)); 

    //name = (char *)malloc(16 * sizeof(char)); 

for(i=1;i<=10;i++) 
{ 
    snprintf(filename, sizeof(char) * 64, "/home/ben/dir%d/name", i); 
    fp = fopen(filename, "r"); 

    if(fp == NULL) 
    { 
      perror("Error opening file"); 
    } 
    fscanf(fp, "%d", &val); 
    fclose(fp); 
    //printf("value-%d is %d\n", i, val); 

    if (val != 0 && val == ind) 
    { 
     snprintf(name, sizeof(char) * 16, "dir%d", i); 

     printf("Dir %s is a has %d\n", name, ind); 
     strncpy(array[found],name, strlen(name)); 
     found++; 
    } 
} 
return array; 
} 

과 내가 같은 주요 기능에서 호출하고 있습니다. 누군가 도울 수 있습니까?

+0

'sizeof (char)'는 리던던트이며 항상 1로 평가됩니다. 또한 C에서'void * '로 변환하기 위해 타입 변환 할 필요가 없습니다. 이것은 함축적입니다. – Qix

답변

1

아마도 strncpy()를 사용하면 안됩니다. strcpy()를 사용하십시오. 그것을 시도하십시오 ... 또한, malloc에 ​​+1을 할당하십시오.

이유 : malloc에 ​​의해 할당 된 메모리는 모두 0으로 사전 초기화되지 않습니다. 그래서 문자열이 제대로 종료되지 않고 printf를 호출 할 때 오버 플로우합니다. 내가 추천하는 추가 +1은 저장하려는 16 개의 실제 문자 이외에 필요한 null 바이트를 저장하는 것입니다.

또한 (i = 1; i < = 10; i ++)가 잘못되었습니다. 루프에서 0에서 < 10, 그리고 귀하의 snprintf에서, i + 1을 사용하십시오.

편집 : 그건 그렇고, 거기에 strdup() 함수를 문자열을 할당합니다. 그것을 사용하려면, 내가 추천 :

1/당신의 배열을 할당 :

문자열을 미리 할당 또는 넣어 당신이 필요하지 않습니다이 너무 NULL로 모든 구성원을 사전 초기화합니다
char **array = calloc(10, sizeof(char *)); 

슬롯에 NULL이 있습니다. 어떤이 준비되어있게 :

if(conditions are ripe) 
    array[found++] = strdup(name); 

그래서 지금, 당신의 루프가 발견 < 0에서 이동합니다 :

2 /에서는 StrDup() 당신이 그들을 저장할 경우에 문자열을 복사합니다. 배열 배열의 할당을 해제하려면 슬롯 0에서 <까지만 free()를 호출하십시오.

+0

'strncpy' 나'strcpy'를 사용하는지 여부에 관계없이이 경우에는 기능상 차이가 없습니다. 그것들은 기본적으로'strcn'을 전달할'strncopy'를 전달하고 있습니다. – Qix

+1

아니요, null로 종료되지 않습니다. –

+0

for 루프에 문제가 있다고 생각하지 않습니다. 나는 배열을 위해 그것을 사용하지 않고있다. 디렉토리 이름과 파일 열기를 수정하기위한 것입니다. 배열 인덱싱에 전역 변수'found'를 사용하고 있습니다. –

0

10 개 개의 문자열에 대한 메모리 할당되어 유효한 배열의 인덱스 0, 특히 9 (포함)까지 열이 유효한 인덱스없는 것을 의미

malloc(10 * sizeof(char *)); 

을 .... 루프를 조정 해보십시오.

for(i=0;i<10;i++) 
+0

그게 유일한 문제는 아니지만 아마도 그 원인이 무엇일까. – Qix

+0

for 루프가 배열 인덱스와 어떤 관계가 있는지 알지 못합니다. 배열 요소에 액세스하기 위해 루프를 사용하지 않습니다. –

+0

@BenWilliams 당신은 main 함수에서'for (i = 1; i <= 10; i ++) printf ("배열 [% d] = % s \ n", i, array [i]); ,'array'는 함수에 의해 반환 된 배열입니다. –

관련 문제