2017-04-01 1 views
0

을 dosent :동적 문자열 배열 내가은 calloc 사용하여 1000 문자 긴 문자열의 동적 배열을 만들려고 해요 작업

int i; 
char** strarr =(char**)calloc(argc,sizeof(char)*1000); 
if(strarr == NULL) 
    return 0; 
strarr[0][0] ='a'; 
printf("%c\n",strarr[0][0]); 

나는 내가 printf와 라인에서 세그먼트 오류를 ​​얻을이 코드를 실행하려고 할 때마다 나는 왜 이런 일이 일어나지 않는지 (argc가 0보다 큰 것으로 가정 할 수 있음) 감사합니다.

Ps 코드는 텍스트 형식으로되어 죄송 메신저하지만이 시도 메신저 모바일을 사용 그래서 코드 기능을

+0

'strarr [0]'은 널 포인터입니다. 'strarr [0] [0]'은 정의되지 않은 행동입니다. – aschepler

답변

0

을 해달라고 :

const int num_of_strings = 255; //argc ? 
const int num_of_chars = 1000; 

int i; 
char** strarr =(char**)malloc(sizeof(char*)*num_of_strings); 

if(strarr == NULL) 
    return 0; 
for (i = 0; i < num_of_strings; i++) strarr[i] = (char*)malloc(sizeof(char)*num_of_chars); 
+0

예, 작동했습니다! 대단히 감사합니다. –

0

안녕과 정의되지 않은 동작의 세계, 가장 어두운 지역 중 하나에 오신 것을 환영합니다 C 언어의 코드에는 여러 가지 문제가있어 여러 가지 경우에 정의되지 않은 동작이 발생하지만 메모리에 액세스하고 할당하지 않은 행의 printf 행에 도달 할 때까지 모든 코드가 실행되어 시스템에서 결국 catch됩니다. 세그먼테이션 결함이 생성됩니다.

하지만 내 생각에, 코드를 살펴 보는 것이 더 나을 것입니다.

  1. int i; 라인에 선언 된 변수 나는 어디서나 당신이 게시 한 코드에서 사용하지 않는,하지만 난 당신이 나중에 필요할 것 같아요.
  2. 문자열의 배열이나 char**을 선언하는 두 번째 줄에는 첫 번째 코드 조각이 있습니다. 즉, 문자에 대한 포인터를 가리키는 포인터가 있음을 의미합니다. 그래서, 당신이 정말로하고 싶은 것은 그 포인터를위한 메모리를 할당하는 것이지, 그들이 가리킬 문자는 아닙니다. charchar*과는 다른 양의 메모리를 사용합니다. 이 선은 따라서 갈 길이 멀다.

    char** strarr = (char**) calloc(argc, sizeof(char*)); 
    

    이 시스템이 32 또는 64 비트인지의 여부에 따라 크기가 4 또는 8 바이트이며, 각각의 메모리는 argc 블록에 대해 메모리를 할당한다.

  3. calloc 함수가 NULL을 반환했는지 여부를 확인하는 것은 매우 훌륭한 작업입니다. 이는 전반적으로 매우 좋은 연습입니다.

  4. 다음으로 앞줄에서 메모리를 할당 한 포인터가 가리키는 문자열 자체에 메모리를 할당해야합니다. 이 행은 그것을 할 것입니다.

    for (int i = 0; i < argc; i++) { 
        strarr[i] = (char*) calloc(1000, sizeof(char)); 
    } 
    

    이제 argc 크기 문자열 배열의 모든 요소에 1000 자 긴 문자열이 할당됩니다.

그런 다음 코드를 그대로 사용하면 오류가 생성되지 않는다고 생각합니다. 제게 조언을 받아주세요. valgrind를 사랑하는 법을 배웁니다. 이것은 메모리를 분석하기 위해 코드를 실행할 수있는 매우 유용한 프로그램입니다. 세분화 오류가 발생할 때마다 내 첫 번째 단계입니다.