在数组中找到孤立的整数
如果可以的话,请参考这个 hackerrank挑战。
问题是在数组中找到孤立的整数,给定一个数组只包含一对,除了一个孤独的整数。
问题出在这个测试用例上
9 4 9 95 93 57 4 57 93 9
9是数组大小,下面是数组
查看// ——突出显示的代码部分
如果我将scanf(“%d”,&n)置于int arr [n]代码上方工作正常,但反过来会产生可怕的结果。 请帮帮我
#include 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; }
你想要使用:
#include /* ... */ int *arr; scanf("%d", &n); arr = malloc(sizeof(int) * n);
这样, arr
在运行时动态分配,因此它可以是任何大小,具体取决于输入n
。
你最初做的事情(即通过scanf接收n
后声明arr[n]
: scanf("%d", &n); int arr[n];
)不是一个好主意,因为它使用了可变长度数组 , C的一个特征,在最新的C标准中不是强制性的。
你看, arr
是在编译时创建的,你通常只能用编译时已知的常量表达式初始化它, n
,一个变量作为用户输入接收,显然不是。 可变长度数组是该语言的一个特性,它基本上允许您绕过此规则,即它们使您能够将数组初始化为编译时未知的长度。 这已在C99中标准化 ,但在C11中被列为“可选”。
之后你做了什么( int arr[n]; scanf("%d", &n);
)是非常不合逻辑的,因为在你收到n
的值作为用户输入之前 ,你将arr
声明为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!
在问题中给出n
范围是1 <= N < 100
,这是小的并且可以使用可变长度arrays 。 但你在这里做错了
int arr[n]; // n is uninitialized. Its value is indeterminate. scanf("%d", &n);
在将其用作数组大小之前,需要初始化n
scanf("%d", &n); int arr[n];
使用未初始化的变量分配数组将导致未定义的行为,编译器将抛出警告“在此函数中使用未初始化的变量”
如果你在运行时获得数组的大小,那么使用@ 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
‘n’的值必须在使用之前定义。就像你正在使用的那样
int arr [n];
在读取’n’的值之前。 所以编译器不会知道,数组’n’中存在多少个元素可能是一个垃圾值。它应该为数组分配多少内存。
因此在使用数组定义之前,你必须读取’n’的值。