无法打印出动态分配的数组中的元素

时间:2018-09-10 13:59:54

标签: c arrays realloc

我有以下代码,我向两个函数传递了相同的指针,但是我只能在addNewValue函数中打印出数组元素。

我对printArray执行相同的操作,但是程序停止并且不打印任何内容。

我应该怎么做才能解决此问题,我已经搜索了stackoverflow,但似乎找不到解决问题的答案。

int main()
{
    int *array = NULL;
    int value;
    int length = 0;
    int *lengthP = &length;

    printf("Enter new value");
    scanf("%d", &value);

    addNewValue(array, value, lengthP);

    printArray(array, lengthP);

    return 0;
}

void printArray(int* array, int* lengthP)
{
    int i = 0;
    int length = *lengthP;

    for(i = 0; i < length; i++)
    {
        printf("%d\n", *array[i]);
    }
}

void addNewValue(int* array, int value, int* lengthP)
{   
    *lengthP = *lengthP + 1;
    int length = *lengthP;

    array = realloc(array, length * sizeof(int));

    if(array == NULL)
    {
        printf("Error");
        return;
    }

    array[length - 1] = value;

    printf("%d", array[0]); 
}

2 个答案:

答案 0 :(得分:2)

无论您的函数addNewValue(array, value, lengthP)做什么,它将永远不会更改指针array传递给它的值。请注意,main中的arrayarray中的addNewValue是两个不同的变量。前者的值(即“内存地址”)被复制到后者的值中,并且addNewValue正在更改副本,而不是main中的原始指针值。因此,array将始终为NULL。因此,您将取消引用NULL并产生未定义的行为。

更改

void addNewValue(int* array, int value, int* lengthP) 

void addNewValue(int** array, int value, int* lengthP) 

并使用

调用
addNewValue(&array, value, lengthP) 

相应地调整addNewValue中的逻辑。

答案 1 :(得分:2)

因为您不修改main的数组(并且addNewValue中分配的数组被泄露,顺便说一句)。

int main() {
    int *array = NULL;
    int value = 42;
    int length = 0;
    int *lengthP = &length;
    addNewValue(&array, value, lengthP);
    printArray(array, lengthP);
}

void addNewValue(int** array, int value, int* lengthP) {   
    *lengthP = *lengthP + 1;
    int length = *lengthP;

    *array = realloc(*array, length * sizeof(int));

    if(*array == NULL) { /* ... */ }

    (*array)[length - 1] = value;
}