我有以下代码,我向两个函数传递了相同的指针,但是我只能在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]);
}
答案 0 :(得分:2)
无论您的函数addNewValue(array, value, lengthP)
做什么,它将永远不会更改指针array
传递给它的值。请注意,main中的array
和array
中的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;
}