如果我想要用户定义的大小,我应该使用数组还是指针
Should I use arrays or pointer if i want a user defined sizes
我的问题很简单,如果我必须在一个数组中输入一个数据,其大小是用户在 C 中定义的,我应该使用指针来存储它们还是数组
#include <stdio.h>
#include <stdlib.h>
int main(){
int *arr, n, i;
printf("Enter number of elements: ");
scanf("%d", &n);
arr=(int *)malloc(n*sizeof(int));
printf("Enter number of elements:\n");
for(i=0; i<n; i++)
scanf("%d", &arr[i]);
}
或
#include <stdio.h>
#include <stdlib.h>
int main(){
int n, i;
printf("Enter number of elements: ");
scanf("%d", &n);
int arr[n];
printf("Enter number of elements:\n");
for(i=0; i<n; i++)
scanf("%d", &arr[i]);
}
我个人觉得使用指针更舒服,但由于 C 对待数组和指针的方式不同,我以后可能会遇到问题。
提供的片段在语义上不匹配。使用 'pointers' 的一个使用 malloc
在堆上分配内存,另一个将在堆栈上分配内存(在后台使用 alloca
)。
此外,C 不会以不同方式对待指针和数组:
int a[10];
a[2] = 69;
在语义上等同于:
int* a = alloca(10 * sizeof(int));
*(a + 2) = 69;
除了 sizeof()
运算符以及将它们作为参数传递时有时如何处理它们之外,它们几乎可以互换。
所以没有真正的区别你可以选择你喜欢的。
而且因为你好像不知道栈和堆的区别:
在栈上分配内存有以下优点:
- 更快
- 更少的内存管理
但是:
- 分配太多 (~ 8kb) 时可能会溢出堆栈
- 将保持分配并占用系统资源,直到函数超出范围
PS:即使在示例
中使用malloc()
时,您也应该始终使用free()
另一个已经暗示但没有完全解释的巨大差异是这两个数组的生命周期。
如果这是一个读取文件的函数,return从中读取一个整数数组
int* ReadInts(){..}
malloc 一个
int*ReadInts(){
int * result = malloc(....);
...
return result;
}
工作正常,但是 vla 没有
int*ReadInts(){
int result[X];
...
return result;
}
您的编译器可能会编译它(可能带有警告)但这是错误的代码。 result
会在 ReadInts returns 时释放,所以这是未定义的行为
我的问题很简单,如果我必须在一个数组中输入一个数据,其大小是用户在 C 中定义的,我应该使用指针来存储它们还是数组
#include <stdio.h>
#include <stdlib.h>
int main(){
int *arr, n, i;
printf("Enter number of elements: ");
scanf("%d", &n);
arr=(int *)malloc(n*sizeof(int));
printf("Enter number of elements:\n");
for(i=0; i<n; i++)
scanf("%d", &arr[i]);
}
或
#include <stdio.h>
#include <stdlib.h>
int main(){
int n, i;
printf("Enter number of elements: ");
scanf("%d", &n);
int arr[n];
printf("Enter number of elements:\n");
for(i=0; i<n; i++)
scanf("%d", &arr[i]);
}
我个人觉得使用指针更舒服,但由于 C 对待数组和指针的方式不同,我以后可能会遇到问题。
提供的片段在语义上不匹配。使用 'pointers' 的一个使用 malloc
在堆上分配内存,另一个将在堆栈上分配内存(在后台使用 alloca
)。
此外,C 不会以不同方式对待指针和数组:
int a[10];
a[2] = 69;
在语义上等同于:
int* a = alloca(10 * sizeof(int));
*(a + 2) = 69;
除了 sizeof()
运算符以及将它们作为参数传递时有时如何处理它们之外,它们几乎可以互换。
所以没有真正的区别你可以选择你喜欢的。
而且因为你好像不知道栈和堆的区别:
在栈上分配内存有以下优点:
- 更快
- 更少的内存管理
但是:
- 分配太多 (~ 8kb) 时可能会溢出堆栈
- 将保持分配并占用系统资源,直到函数超出范围
PS:即使在示例
中使用malloc()
时,您也应该始终使用free()
另一个已经暗示但没有完全解释的巨大差异是这两个数组的生命周期。
如果这是一个读取文件的函数,return从中读取一个整数数组
int* ReadInts(){..}
malloc 一个
int*ReadInts(){
int * result = malloc(....);
...
return result;
}
工作正常,但是 vla 没有
int*ReadInts(){
int result[X];
...
return result;
}
您的编译器可能会编译它(可能带有警告)但这是错误的代码。 result
会在 ReadInts returns 时释放,所以这是未定义的行为