动态二维数组

时间:2015-01-04 16:36:31

标签: c

我正在尝试用动态二维数组编写程序。我创建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;
}

2 个答案:

答案 0 :(得分: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.

答案 1 :(得分: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)); 成功后就足够了

    malloc
  3. 您应该检查调用reallocNULL的结果。如果失败,则这些函数返回NULL,如果指针为for (int i = 0; i < 5; i++) { for (int j = 0; j < size[i]; j++) { printf("%d ", array[i][j]); } printf("\n"); } ,则对指针的任何后续访问都是未定义的行为。

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

    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;
    }
    

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

  5. 这是您修复的主要功能

    {{1}}