1

저는 C로 쓰는 법을 가르쳐 왔으며, 꽤 큰 프로그램을 성공적으로 작성했습니다. 프로그램을 컴파일하거나 실행하는 데 문제가 없지만 배열 데이터 유형의 메모리 할당과 관련된 세부적인 사항에 조금 관심이 있습니다.배열 데이터 형식 메모리 할당

나는 동적으로 다음과 같은 방식으로 배열에 메모리를 할당 :이 NX3 배열을 구성하기위한 완벽하게 잘 작동

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

내가 그것에 대해 기쁘다; 그러나 이전의 수많은 Q & A에서 컨텍스트를 가져 왔지만 배열 자체뿐만 아니라 배열의 각 요소를 비울 필요가 있습니다. 왜, 내 경우 엔 요소들을 풀어 낼 수 없습니까? 이 작업을 수행 할 때 :

for(i=0; i<n; i++){ 
    free(array[i]); 
} 
free(array); 

루프로 인해 메모리가 손상됩니다. 루프를 제거하고 단순히 배열을 비울 때 세그멘테이션 오류나 손상이 없으며 원활하게 실행됩니다. 누군가 제게 이것을 설명해 주시겠습니까? 이 경우 포인터에서 변수를 해제하는 원리를 이해하지 못합니까?

감사와 안부, 마이크

+0

SSCCE (http://sscce.org/)를 제공하십시오 ... 귀하의 문제는 우리에게 표시되지 않은 코드 일 가능성이 높습니다 ... 확률은 할당 된 메모리의 범위를 벗어났습니다 . 또는 메모리를 확보 한 후 사용하십시오. –

+0

답변 해 주셔서 감사합니다. 학문적 독점 데이터를 분석하기 위해이 프로그램을 작성 했으므로 프로그램을 제공 할 수 없습니다. 그것은 또한 1000 라인 이상이고 조사하는 시간을 낭비하고 싶지 않을 것이라고 확신합니다. 나는이 기억을 전혀 풀어주지 않았기 때문에 주로 호기심이 많습니다. 그리고 수천 개의 데이터 포인트를 실행하는 while 루프 안에 앉아서 더 많은 수천 개의 포인트를 i = 0에서 새로 시작합니다. 나는 왜 그것이 seg fault가 아닌지 보지 않고있다 ... –

+0

나는 당신에게 프로그램을 제공 할 것을 요구하지 않았고, SSCCE를 제공하라는 요구를했다. "나는 그것이 왜 잘못되지 않았는지 안다"- 응? 첫째, 왜 당신이 세그먼트를 기대하는 이유는 무엇입니까? 둘째, segfaulting은 결코 보장되지 않습니다 * ... 충돌을 일으키지 않는 무효 한 프로그램을 갖는 것은 쉽습니다. malloced 영역의 손상으로 인해 메모리가 해제 될 때 segfault가 발생하는 경우가 있습니다. 나는 valgrind와 같은 디버거와 메모리 손상 탐지 도구에 대해 배우는 것이 좋습니다. –

답변

0

은 여기 MCVE (How to create a Minimal, Complete, and Verifiable Example?) 또는 SSCCE있어 (Short, Self-Contained, Correct Example) - 코드에 매우 밀접하게 기반 - 같은 생각에 대한 두 개의 이름과 링크 :

#include <stdlib.h> 

int main(void) 
{ 
    int i; 
    int n = 20; 
    double **array = malloc(n * sizeof(*array)); 
    for (i = 0; i < n; i++) 
    { 
     array[i] = malloc(3 * sizeof(*(array[i]))); 
    } 

    for (int x = 0; x < n; x++) 
     for (int y = 0; y < 3; y++) 
      array[x][y] = 0.0; 

    for (i = 0; i < n; i++) 
    { 
     free(array[i]); 
    } 
    free(array); 
    return 0; 
} 

Mac OS X 10.9.5에서 GCC 4.9.1로 컴파일하고 valgrind 3.10.0에서 실행하면 다음과 같은 상태로 정리됩니다.

==7957== Memcheck, a memory error detector 
==7957== Copyright (C) 2002-2013, and GNU GPL'd, by Julian Seward et al. 
==7957== Using Valgrind-3.10.0.SVN and LibVEX; rerun with -h for copyright info 
==7957== Command: mma 
==7957== 
==7957== 
==7957== HEAP SUMMARY: 
==7957==  in use at exit: 25,245 bytes in 373 blocks 
==7957== total heap usage: 470 allocs, 97 frees, 31,829 bytes allocated 
==7957== 
==7957== LEAK SUMMARY: 
==7957== definitely lost: 0 bytes in 0 blocks 
==7957== indirectly lost: 0 bytes in 0 blocks 
==7957==  possibly lost: 0 bytes in 0 blocks 
==7957== still reachable: 0 bytes in 0 blocks 
==7957==   suppressed: 25,245 bytes in 373 blocks 
==7957== 
==7957== For counts of detected and suppressed errors, rerun with: -v 
==7957== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 

(맥 OS X 런타임 라이브러리에 의해 수행 메모리 할당을 많이는 항상있다.) 강하게 문제는 메모리 할당 또는 할당 해제 코드가 아니라 코드에서 메모리가 어디 제안

(mis)를 사용합니다.