2015-01-04 109 views
-1

我想用动态二维数组写一个程序。我创建了5个指针数组,然后我想将一个值放在选定的5数组上,我需要重新分配才能将另一个数组放在同一个数组中,但是出现错误,我不知道如果这是正确的。有人可以帮帮我吗。动态二维数组

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

void putValue(int** array, int* size, int value, int n) { 
    if (n == 1) { 
     array[0][size[0] - 1] = value; 
     size[0]++; 
     array[0] = (int*)realloc(array, size[0] * sizeof(int)); 
    } else if (n == 2) { 
     array[1][size[1] - 1] = value; 
     size[1]++; 
     array[1] = (int*)realloc(array, size[1] * sizeof(int)); 
    } else if (n == 3) { 
     array[2][size[3] - 1] = value; 
     size[2]++; 
     array[2] = (int*)realloc(array, size[2] * sizeof(int)); 
    } else if (n == 4) { 
     array[3][size[3] - 1] = value; 
     size[3]++; 
     array[3] = (int*)realloc(array, size[3] * sizeof(int)); 
    } else if (n == 5) { 
     array[4][size[4] - 1] = value; 
     size[4]++; 
     array[4] = (int*)realloc(array, size[4] * sizeof(int)); 
    } 
} 

int main(void) { 
    int** array; 
    int* size; 

    size = (int*)malloc(5 * sizeof(int)); 

    for (int i = 0; i < 5; i++) { 
     size[i] = 1; 
    } 

    array = (int**)malloc(5 * sizeof(int*)); 

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

    putValue(array, size, 5, 1); 

    for (int i = 0; i < 5; i++) { 
     for (int j = 0; j < size[i]; j++) { 
      printf("%d ", array[i][j]); 
     } 
     printf("\n"); 
    } 

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

    free(array); 
    free(size); 

    return 0; 
} 
+0

* *什么错误?帮助什么?这不是很明显,你的问题是什么...... – talonmies

+0

不要施加'malloc'的结果和'1 * sizeof(int)'应该用于什么? –

+0

错误如下:释放的指针未分配 1 * sizeof(int)应为1个元素分配内存。“ – firana

回答

1

你错阵列上使用realloc,这

array[0] = realloc(array, size[0] * sizeof(int)); 

应该

array[0] = realloc(array[0], size[0] * sizeof(int)); 

另外也没有必要从void*转换为任何事情,因为在C的隐,array = malloc(5 * sizeof(int*))就足够了。

此外,您可以使用您传递给putValue函数,而不是该指数具有不同的情况,如:

void putValue(int** array, int* size, int value, int n) { 
    --n; 
    array[n][size[n] - 1] = value; 
    size[n]++; 
    array[n] = realloc(array[n], size[n] * sizeof(int)); 
} 

最后记住,你的动态数组的语义的工作原理是将尺寸大于一当前的元素数量,这不是精确的,你应该从一个空数组开始,并向它们添加元素。实际上,你从一个1元素数组开始,并在添加一个元素后以2的大小结束。

+0

”你应该从一个空数组开始,并向它们添加元素,实际上,你从一个1元素数组开始,最后添加一个元素后大小为2。 这正是我想要做的,但我该怎么做?我只能在使用malloc之后才能使用realloc,这怎么可能? – firana

0

你有几个问题

  1. putValue功能不会为n > 5工作,它违背了DRY原则,写一个更好的方式,将是

    void putValue(int** array, int* size, int value, int n) { 
        void *auxiliary; 
    
        --n; 
    
        auxiliary = realloc(array[n], (1 + size[n]) * sizeof(int)); 
        if (auxiliary == NULL) { 
         fprintf(stderr, "out of memory\n"); 
         return; 
        } 
        array[n]   = auxiliary;   
        array[n][size[n]++] = value;   
    } 
    
  2. 第一malloc环对于array不是必需的,realloc表现得像malloc当它的第一个参数是NULL所以memset的检查malloc(5 * sizeof(int*))成功后足以

    memset(array, 0, 5 * sizeof(*array)); 
    
  3. 您应该检查调用mallocrealloc的结果。在失败者的情况下,这些函数返回NULL,如果指针是NULL,则对该指针的任何后续访问都是未定义的行为。

  4. 这个循环是错误的,因为你没有初始化数组

    for (int i = 0; i < 5; i++) { 
        for (int j = 0; j < size[i]; j++) { 
         printf("%d ", array[i][j]); 
        } 
        printf("\n"); 
    } 
    

    访问未初始化的值,也未定义行为。

这里是你的主要功能固定

int main(void) { 
    int** array; 
    int* size; 

    size = malloc(5 * sizeof(*size)); 
    if (size == NULL) { 
     fprintf(stderr, "out of memory\n"); 
     return -1; 
    } 
    memset(size, 0, 5 * sizeof(*size)); 

    array = malloc(5 * sizeof(*array)); 
    if (array == NULL) { 
     fprintf(stderr, "out of memory\n"); 

     free(size); 
     return -1; 
    } 
    memset(array, 0, 5 * sizeof(*array)); 

    /* initialize the arrays */ 
    for (int i = 0 ; i < 5 ; ++i) 
     putValue(array, size, i, 1 + i); 

    /* print the arrays */ 
    for (int i = 0; i < 5; i++) { 
     for (int j = 0; j < size[i]; j++) { 
      printf("%d ", array[i][j]); 
     } 
     printf("\n"); 
    } 

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

    free(array); 
    free(size); 

    return 0; 
} 
+0

1.清除 2.我以为我必须使用malloc才能使用realloc? 3.清除 4.那么,如何在打印数组后看到它的外观如何打印数组? – firana

+0

@firana我更新了答案。 –

+0

非常感谢你,最后一个问题,现在这是按照杰克在最后一句中描述的方式工作,还是它的尺寸仍然大于当前元素的数量? – firana