【发布时间】:2021-09-21 05:37:00
【问题描述】:
我是 C 编程语言的新手,开始搞乱指针和为对象分配内存。我想制作一个简单的程序,从用户那里读取 (x) 个元素,然后使用函数简单地将它们打印出来。
这是我一开始的初始代码。代码可以正确读取用户输入,但在主函数中显示元素时输出错误并崩溃。
int main() {
int *myArr;
int myArrSize;
getInputArr(&myArrSize, &myArr);
for (int i = 0; i < myArrSize; i++) {
printf("Element No.%i: %i\n", i, myArr[i]);
}
free(myArr);
return 0;
}
void getInputArr(int *arrSize, int *arr) {
printf("Please Enter Length of Array: \n");
scanf("%i", arrSize);
arr = (int *) malloc(*arrSize * sizeof(int));
printf("Enter %i Numbers!\n", *arrSize);
for (int i = 0; i < *arrSize; i++) {
scanf("%i", &arr[i]);
}
}
在搞砸之后,我终于用双指针让它工作了,但我不确定它是如何工作的,有人能解释一下为什么下面的代码会按预期运行吗?
int main() {
int *myArr;
int myArrSize;
getInputArr(&myArrSize, &myArr);
for (int i = 0; i < myArrSize; i++) {
printf("Element No.%i: %i\n", i, myArr[i]);
}
free(myArr);
return 0;
}
void getInputArr(int *arrSize, int **myArr) {
printf("Please Enter Length of Array: \n");
scanf("%i", arrSize);
*myArr = (int *) malloc(*arrSize * sizeof(int));
printf("Enter %i Numbers!\n", *arrSize);
for (int i = 0; i < *arrSize; i++) {
scanf("%i", &((*myArr)[i]));
}
}
【问题讨论】:
-
指针在 C 中用于两种不同的事情: 1) 变量按值传递给函数 - 函数获取变量的副本。如果你想改变函数内部的变量,你需要传递一个指针——这样函数就可以获得指针的副本,并且它们都指向的值可以被改变。 2)分配内存需要一个指针。现在,想想如何组合这些东西——一个你可以改变的函数参数(一个指针),但它指向的值是一个指向已分配内存的指针:它是一个指向指针的指针(你称之为双指针)
-
不确定您是否具备 C 知识,但您有两条相关信息:数组大小和(动态分配的)数组。您可能希望将它们包装在一个结构中并传递它。
标签: c function pointers dereference double-pointer