2017-12-09 24 views
-1

안녕하세요
나는이 프로그램을 작성하여 사용자가 제공 한 책 목록을 만들고 프로그램 끝에 my_value를 풀어 놓고 많은 오류가 발생할 수 없습니다.
malloc의 예약 된 데이터

char **array=(char *) malloc((n+1)*sizeof(char *)); 

내 코드

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


int main(){ 



int n; 
printf("Please Enter the Number of Books:\n"); 
scanf("%d",&n); 
char **array=(char *) malloc((n+1)*sizeof(char *)); 

for(int i=0;i<n;i++){ 
array[i] = (char *)malloc(sizeof(char *)); 
} 

for(int i=0;i<n;i++){ 
char *my_value=(char *) malloc(sizeof(char)*100); 
printf("Please Enter the Name of the %dth Book:\n",i+1); 
scanf("%s",my_value); 
*(array+i)=my_value; 
free(my_value); 

} 

for(int i=0;i<n;i++){ 
printf("\n The Book Nr.%d is %s \n",i+1,*(array+i)); 
} 
for(int i=0;i<n;i++){ 
free(array[i]); 
} 
free(array); 


return 0 ; 
} 
+0

어떤 종류의 오류가 발생합니까? 어떤 플랫폼을 개발하고 있습니까? [Valgrind] (http://valgrind.org/)를 사용 했습니까? 샘플 데이터를 보여주고 샘플 데이터에서 얻은 오류를보고해야합니다. 어쩌면 단지 2 권의 책 상당의 데이터 일 것입니다. 아마도 충분할 것입니다. MCVE ([MCVE])를 만드는 방법에 대해 읽어보십시오. 데이터와 출력 (실제 대 예상되는 것)은 모두 MCVE의 일부입니다. –

+0

'malloc'의 결과를 캐스팅 할 필요가 없습니다. [malloc의 결과를 캐스팅합니까?] (https://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc)를 참조하십시오. 게다가,'char ** array = (char *) malloc ((n + 1) * sizeof (char *))'는 호환되지 않는 포인터 타입을 가지고있다. – Galen

답변

0

첫째, 당신은 n를 사용하기 때문에 당신이 n+1 포인터가 필요하지 않습니다. 이어서

이 루프

for(int i=0;i<n;i++){ 
    array[i] = (char *)malloc(sizeof(char *)); 
} 

불필요한 (잘못된)이다. array[i]은 직후에 덮어 씁니다. array[i] 그 시점에서 더 이상 사용할 수 없습니다 - 다음 루프에서

*(array+i)=my_value; // is array[i] = my_value 
free(my_value);  // <=== why? remove that line! 

방금 ​​할당 무엇을 무료로! 정의되지 않은 동작으로 이어진다.