2017-12-03 17 views
0

학교 프로젝트를 수행하는 데 약간의 문제가 있습니다. 학교 동료가 복사 할 수 있기 때문에 여기에 모든 코드를 게시 할 수 없습니다.동적 매트릭스가있는 동적 구조체

char ** phrases, int lines (현재 문구 수), int heaplines(max number of lines my char ** phrases can hold)이라는 변수가있는 Messages라는 동적 구조를 만들었습니다.

내 프로그램은 다음과 같이 작동해야합니다. 메시지를 삽입하고 메모리를 할당하고 현재 메시지의 개수 인 가변 선을 늘리라는 메시지를 사용자에게 묻습니다. +10 플러스 라인을 재 할당하면 헤라 플린이 증가합니다. 하지만 내 진정한 문제는 내가 나에게 오류 속담을 제공하기 때문에 사용자가 삽입 한 문자열로 메모리를 할당하지 못할 수 있습니다 :

Incompatible Pointers types "char **" and "char *" 

.

MSG->phrases=(char*)malloc((tamphrase+1)*sizeof(char)); 

가 완벽하게 작동 char ** msg의 매트릭스 라인을 할당,하지만 난 삽입 할 것입니다 문자열에 대한 메모리를 할당 할 때 그것은 위의 코드의 줄에 나에게 그 오류를 제공합니다.

Btw, 어떻게 구의 행렬을 증가시킬 수 있습니까? 예를 들어 :

MSG->(phrases+i)=(char*)malloc((tamphrase+1)*sizeof(char)); 

(I이 잘못 알고,하지만 난 너희들은 내가 말하려고 해요 알고 희망)

+0

게시하시기 바랍니다 코드 같은 것입니다. 답변을 얻는 유일한 방법입니다. – DaFois

답변

1

MSG->phrases=(char*)malloc((tamphrase+1)*sizeof(char));이 될 것이다 그것에 char** 때문에 메모리 할당입니다

MSG->phrases=malloc((tamphrase+1)*sizeof(char*)); 

그렇다면 각각의 tamphrase에 대해 문자를 저장할 메모리를 할당하십시오.

MSG->phrases[i]=malloc((MAXLENOFLINE+1)*sizeof(char)); 

또한 당신은 당신이 당신의 코드에 이미 할당 된 메모리가 부족하면 재 할당에 대한 아이디어를 얻을에 대한 realloc을 읽어야합니다.

malloc의 반환 값을 캐스팅하지 않아도되므로 불필요하므로 오류 발생시 오류를 줄일 수 있습니다.


포인터의 논리를 이해하면이 줄을 쓰는 데 문제가 없습니다.

귀하는 phraseschar**입니다. 이제 char**의 내용을 생각해보십시오. 변수의 주소는 char*입니다. 이제 각각 char* 변수를 보유 할 수있는 메모리 덩어리를 할당 한 다음 그 시작 주소를 phrases으로 반환합니다.

다른 방식으로 생각하면 똑같은 방식으로 char*char 변수의 주소가 저장됩니다. char 변수를 저장할 메모리를 할당합니다. 시작 주소를 char* 변수로 반환합니다. phrases[i]은이를 유지합니다.세부 사항으로가는없이


는 코드의 일반적인 구조는

MSG->phrases=malloc((tamphrase+1)*sizeof(char*)); 
if(MSG->phrases == NULL){ 
    fprintf(stderr,"Error in malloc"); 
    exit(1); 
} 
for(size_t i = 0; i < tamphrase+1; i++){ 
    MSG->phrases[i]=malloc((MAX_LINE_LENGTH+1)*sizeof(char)); 
    if(MSG->phrases[i] == NULL){ 
     fprintf(stderr,"Error in malloc"); 
     exit(1); 
    }  
} 
... 
... 
// do cool stuff 
.. 
.. 

//free the allocated memory 
for(size_t i = 0; i < tamphrase+1; i++){ 
    free(MSG->phrases[i]); 
} 
free(MSG->phrases);