... 과거에는 내 질문이 좋지 않다고 들었습니다 ... 문제가되는 코드를 충분히 분리하지 않았기 때문에 주로 믿습니다. 나는이 게시물의 핵심 질문에 대해 간결하고 간결한 질문을하기 위해 최선을 다할 것입니다. 나는 내 질문에 어떻게 더 좋은 질문을 할 수 있을지에 대한 제안을하고있다. 감사합니다. .마지막 루프 반복시 메모리 할당 오류가 발생했습니다.
저는 C에서 작은 프로젝트를 작업하고 있습니다.이 프로젝트는 제가 오랫동안 작업 해 왔던 커다란 버그가있는 프로그램의 프로토 타입 역할을 할 것입니다. 작은 프로그램에서 세부 사항을 먼저 연습하려고합니다. 나는 두 개의 구조체가 있습니다
struct list
{
char ownerName[20];
int ownerAge;
char sex;
}owner;
및
struct list2
{
char petName[20];
char owner[20];
char animal[4];
char breed[50];
char color[20];
}pets;
이 프로그램은 사용자의 입력에서시^Ownername을하고는 fgets와 비교하도록되어 애완 동물 구조체에서 ".owner"로 설정합니다. ownerName 및 petName 요소는 배열에 복사해야하며 소유자 이름과 애완 동물 이름이 목록에 인쇄됩니다. 이 작업을 수행하기 위해 소유자 구조체가 필요 없다는 것을 알고 있지만, 필자가 쓰고있는 다른 프로그램을 모델링하는 데 사용하고 있습니다.
나는 구조체 요소를 비교하고이 부분을 갖고있는 것 같다하기
if (strcmp(pets[i].owner, name) == 0)
을 사용하고 있습니다.
변수 j는이 기준을 충족하는 레코드 수를 카운트하고, 변수 L = J + 1은 I 사용하여 어레이 호출 (j 배열의 크기 (L)에 의해 결정된다
char *petsList[l];
을 +1) 소유자 이름으로 petNames + 1 요소에 j 요소가 필요하기 때문입니다.
은 또한을 통해 petsList 배열에 대한 포인터를 만든 다음
소유자의 이름은 다음 명령을 통해 배열에 추가됩니다char *(*ptr)[l] = &petsList
다음 petNames가 추가
(*ptr)[0] = (char *)malloc(sizeof(name));
strcpy ((*ptr)[0], name);
for 루프를 사용하여 petsList 배열에 추가합니다. 내가 = 1 [0] 덮어 쓰지 petsList을 방지하기 위해 다음과 같은 루프를 통해 배열에 petNames를 작성하는 것을 시도하고 초기화했습니다
i = 1;
for (k=0; k < PETS; k++)
{
if (strcmp(pets[k].owner, name) == 0)
{
(*ptr)[i] = (char *)malloc(sizeof(pets[k].petName));
if (!*(ptr)[i])
{
puts("\nMemory Allocation Error");
exit (1);
}
strcpy((*ptr)[i], pets[k].petName);
i++;
}
}
이의 이름 주어진 입력에 대해 말을하자, 나는 3 개 애완 동물을 얻을 그 일치. 루프는 처음 두 번 반복하지만 루프의 세 번째 반복에서는 메모리 할당 오류가 발생합니다. 이것은 루프의 마지막 반복에서 일관되게 발생합니다. 예를 들어 ownerName과 연결된 2 마리의 애완 동물이있는 경우 목록에서 첫 번째 반복을 실행하고 두 번째에서는 실패합니다. 내가 4 마리의 애완 동물을 ownerName과 연관 시키면, 루프는 처음 3 번 제대로 실행되고 4 번째에 실패하므로 루프의 최종 반복이 계속 실패합니다. 여러 번 코드를 변경해 보았지만이 프로그램을 통해 앞으로 나아갈 수있는 방법에 대한 손실이 발생했습니다. 어떤 도움이라도 대단히 감사합니다.
감사합니다.
후 더 많은 공간을 확보 할 수 realloc 함수 경우' * ptr' 배열? 'i'는 유효한 색인입니까? 그리고 [C에서'malloc'을 반환해서는 안됩니다.] (http://stackoverflow.com/questions/605845/do-i-cast-the-result-of-malloc). –
['valgrind'] (http://valgrind.org/)는 프로그램이 무엇을 잘못하고 있는지에 대해 말해야 만합니다. VLA의 동적 할당은 가능하지만 까다로운 작업입니다. 코드가 정확하고 시간이 없다는 것을 알기 위해 코드를 매우 자세히 살펴야합니다. MCVE ([최소, 완전 검증 가능한 예제] (http://stackoverflow.com/help/mcve)) 또는 SSCCE ([짧은, 자체 포함, 올바른 예] (http : // sscce .org /)). –
'sizeof (name)'는 문자열의 길이가 아니라'char *'의 크기를 얻는다. 'malloc (strlen (name) +1)'을 시도하십시오. 또한 왜 직접 petsList 대신 포인터를 사용해야합니까? 만약 당신이 그렇게한다면,'char ** ptr = petsList; '를 사용하고'ptr [i]'만 사용하여'i'' char *에 접근 할 수 있습니다. 이것은 읽기 쉽고 사용하기 쉽습니다. 여러분이 가지고있는 배열 포인터는 배열 배열에 대해 더 이해할 수 있지만, 그것이 여러분이 가진 것과 다릅니다. – Dmitri