如果可以,请参阅this hackerrank challenge。
问题是在数组中找到孤独的整数,给定一个数组只包含一对,除了一个孤独的整数。
问题在于此测试用例
9
4 9 95 93 57 4 57 93 9
9是数组大小,下面是数组
查看// ------
突出显示的代码部分如果我将scanf(“%d”,& n)放在int arr [n]代码上工作正常,但反过来会产生可怕的结果。请帮帮我
#include <stdio.h>
int lonely_integer(int* a, int size);
int main(){
//n is size of array, i is counter variable
int n, i, result;
// ---------------------
int arr[n];
scanf("%d", &n);
// ---------------------
printf("%d\n", n);
for(i = 0; i < n; i++){
scanf("%d", &arr[i]);
}
result = lonely_integer(arr, n);
printf("%d", result);
return 0;
}
int lonely_integer(int* a, int size){
int i;
int res = 0;
for(i = 0; i < size; i++){
res = res ^ a[i];
}
return res;
}
答案 0 :(得分:1)
您想要使用:
#include <stdlib.h>
/* ... */
int *arr;
scanf("%d", &n);
arr = malloc(sizeof(int) * n);
这样,arr
在运行时动态分配,因此它可以是任意大小,具体取决于输入n
。
您最初所做的事情(即通过scanf arr[n]
收到n
后声明scanf("%d", &n); int arr[n];
并不是一个好主意,因为它使用了可变长度数组< / strong>,C的一个特征,在最新的C标准中不是强制性的。
你看,arr
是在编译时创建的,你通常只能用编译时已知的常量表达式初始化它,n
,变量收到用户输入,显然不是。可变长度数组是该语言的一个特性,它基本上允许您绕过此规则,即它们使您能够将数组初始化为编译时未知的长度。这已在 C99 中标准化,但在 C11 时被列为“可选”。
之后您所做的事情(int arr[n]; scanf("%d", &n);
)非常不合逻辑,因为您在之前将arr
声明为n
整数的数组n
的值作为用户输入,并且,知道它的值。它会打印垃圾,因为n
最初初始化为未指定的“垃圾”值,这就是您声明它时VLA的大小:
int arr[n]; //n is garbage at this point, you have no idea how large arr will be!
scanf("%d", &n); //you got the value of n that you needed, but too late, alas!
答案 1 :(得分:1)
问题n
中的1 <= N < 100
范围很小,可以使用variable length array。但你在这里做错了
int arr[n]; // n is uninitialized. Its value is indeterminate.
scanf("%d", &n);
在将其用作数组大小
之前,您需要初始化n
scanf("%d", &n);
int arr[n];
答案 2 :(得分:0)
使用未初始化的变量分配数组将导致未定义的行为,编译器将发出警告“在此函数中未初始化使用的变量”
如果你在运行时获得数组的大小,那么使用动态内存分配是明智的@ Mints97发布
int data_size;
int *data_array;
scanf("%d", &data_size);
data_array = (int*)calloc(data_size,sizeof(int));
/*
.
*/
// Free the memory at the end
free(data_array);
data_array = NULL;
如果要在编译时设置数组大小,可以定义宏
#define DATA_SIZE 9
或在编译代码时设置宏
gcc test.c -o test -DDATA_SIZE=9 -Wall
答案 3 :(得分:0)
'n'的值必须在使用之前定义。就像你正在使用
int arr [n];
在读取'n'的值之前。所以编译器不会知道,数组'n'中存在多少个元素可能是一个垃圾值。它应该为数组分配多少内存。
因此在使用数组定义之前,你必须读取'n'的值。