我必须编写函数来读取数组长度和数组,并使该数组能够用于其他函数。
我已经阅读了许多有关指针的内容,但我没有找到问题的答案。 这是我的代码。
int readArray(int *ar, int *pointer){
int i, length;
scanf("%d", &length);
ar = (int *) malloc(length * sizeof(int));
for(i = 0; i < length; i++){
scanf("%d", pointer + i);
}
return length;
}
void printArray(int *pointer, int length){
int i;
for(i = 0; i < length; i++){
printf("%d ", *(pointer + i));
}
}
int main(){
int *pointer, *ar, length;
pointer = ar[0];//Here I get the warnings.
length = readArray(ar, pointer);
printArray(pointer, length);
return 0;
}
代码块中的警告:
warning: assignment makes pointer from integer without a cast
和
warning: 'ar' is used uninitialized in this function [-Wuninitialized]|
。
这个问题与此Dynamic memory access only works inside function不同,因为我必须在readArray函数中读取数组长度。对我来说,作为一个初学者,只有很小的差别是一个很大的区别。
答案 0 :(得分:2)
我会考虑2个选项。一个返回指向数组的指针,并将长度保存为指针,另一个返回长度,但接受指向指针的指针作为参数。
此选项将返回指向已分配和已填充数组的指针,长度将保存到作为参数传递的指针
int* readArray(int* length) {
int* arr;
//Scan for length
scanf("%d", length);
//Allocate memory
arr = (int *)malloc(...);
//Fill data
...
return arr;
}
我会像这样使用它:
int length;
int *pointer;
pointer = readArray(&length);
printArray(pointer, length);
int readArray(int ** ar) {
int length;
....
*ar = (int *)malloc(...);
...
return length;
}
用法:
int* ar;
int length;
length = readArray(&ar);
printArray(ar, length);
我会选择这个选项。
答案 1 :(得分:1)
你真的想要这个:
int readArray(int **ar) {
int i, length;
scanf("%d", &length);
*ar = (int *)malloc(length * sizeof(int));
for (i = 0; i < length; i++) {
scanf("%d", &(*ar)[i]);
}
return length;
}
void printArray(int *pointer, int length) {
int i;
for (i = 0; i < length; i++) {
printf("%d ", *(pointer + i));
}
}
int main() {
int *ar, length;
length = readArray(&ar);
printArray(ar, length);
return 0;
}
变量在C中传递,包括指针。使用您的解决方案:
int readArray(int *ar, int *pointer){
int i, length;
scanf("%d", &length);
ar = (int *) malloc(length * sizeof(int));
for(i = 0; i < length; i++){
scanf("%d", pointer + i);
}
return length;
}
ar
是readArray
的本地变量,pointer
永远不会修改main
。
考虑一下:
void foo(int bar)
{
bar = 123;
}
...
int a = 1;
foo(a);
// a won't contain 123 here