我希望有一个全局数组,可以将其复制到本地数组中,以便进行每个菜单选择'。您可以在选择1中指定数组的大小,当您将本地数组复制到全局数组时,我觉得这会混淆全局数组大小。当试图完成这个'复制'在'菜单1'您将收到"分段故障(核心转储)"错误,如果您的金额为'是高(10,000 +)。
同样在退出程序时,您会收到"分段故障(核心转储)"代码139错误。
所以我的问题是如何复制一个阵列,我仍然可以拥有一个全局数组'而不是遇到这些错误。我包含了一些 sizeof array printf来检查大小,因为正如我上面所说,我认为在复制之前需要做一些事情来改变数组的大小。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <fcntl.h>
#include <unistd.h>
#include <inttypes.h>
#include <time.h>
#include <sys/time.h>
#include <string.h>
int main()
{
int choice = 0; // menu variable
int global_amount = 0; //random number generator var's
int globalArray[0];
do
{
system("clear");
printf("Menu\n");
printf("1: Random Number Generator\n");
printf("2: Bubble Sort\n");
printf("3: Exit\n");
printf("\nNote: Only Random Number Generator Writes To Global Array!\n");
printf("\nMenu Choice: ");
scanf ("%d", &choice);
if (choice == 1)
{
system("clear");
printf("Random Number Generator\n");
printf("---------\n");
printf("Enter the amount of numbers you want (range will be from 0-99): ");
scanf ("%d", &global_amount);
int highest = 99;
// initilize array with size "amount" specified above
int randArray[global_amount];
int i, randomNumber;
for(i=0;i<global_amount;i++)
{
randomNumber = rand() % highest;
randArray[i] = randomNumber;
}
printf("\nArray Filled With Random Numbers 0 through %d\n\n", highest);
printf("\nSize of arrays before copy\n");
printf("randArray - %zu\n", sizeof(randArray));
printf("globalArray - %zu\n", sizeof(globalArray));
// copy local array to global array
for(i=0;i<global_amount;i++)
{
globalArray[i] = randArray[i];
}
printf("\nSize of arrays after copy\n");
printf("randArray - %zu\n", sizeof(randArray));
printf("globalArray - %zu\n", sizeof(globalArray));
// prints out your array
printf("\nYour array has these values: \n");
for(i=0;i<global_amount;i++)
{
printf("%d ", globalArray[i]);
}
printf("\n");
printf("\nPress enter to continue...\n");
char var;scanf ("%c", &var);scanf ("%c", &var);
}
else if (choice == 2)
{
system("clear");
printf("Bubble Sort\n");
printf("---------\n");
int i;
int bubbleArray[global_amount]; // local array
// copy global array to local array
for(i=0;i<global_amount;i++)
{
bubbleArray[i] = globalArray[i];
}
// display array to be sorted
printf("Your array had these values: \n");
for(i=0;i<global_amount;i++)
{
printf("%d ", bubbleArray[i]);
}
// bubble sort code
int c, d, swap;
for (c = 0 ; c < ( global_amount - 1 ); c++)
{
for (d = 0 ; d < global_amount - c - 1; d++)
{
if (bubbleArray[d] > bubbleArray[d+1]) /* For decreasing order use < */
{
swap = bubbleArray[d];
bubbleArray[d] = bubbleArray[d+1];
bubbleArray[d+1] = swap;
}
}
}
printf("\n\nBubble Sort Completed\n");
// display sorted array
printf("\n");
printf("Sorted array list in ascending order:\n");
for ( c = 0 ; c < global_amount ; c++ )
{
printf("%d ", bubbleArray[c]);
}
printf("\n");
printf("\nPress enter to continue...\n");
char var;scanf ("%c", &var);scanf ("%c", &var);
}
else if (choice == 3)
{
system("clear");
return 0;
}
else
{
system("clear");
printf("That is not a valid entry.\n");
printf("Press enter to continue...\n");
char var;scanf ("%c", &var);scanf ("%c", &var);
}
}
while (choice !=3);
return 0;
}
答案 0 :(得分:1)
你的“global_array”的大小为零,所以它基本上是一个堆栈上的地址,当数字被复制到它时,它会覆盖其他堆栈内容。当您通过堆栈段的边缘时,您会得到Segmentation fault
。
你的randArray是一个C99 VLA(可变长度数组),它也存在于堆栈中,但它有适当的大小。
注意,术语“全局”通常用于具有文件范围且不在堆栈中的变量。
答案 1 :(得分:1)
C中的数组不会自动调整大小。定义alert()
不是如何做到的。
您需要为int globalArray[0];
动态分配空间,如下所示:
globalArray
在NULL指针上调用int *globalArray = NULL; // initialize to NULL so you can safely clean up
...
// if globalArray was allocated before, free it
free(globalArray);
// allocate space for global_amount ints
globalArray = malloc(sizeof(int)*global_amount);
// copy local array to global array
for(i=0;i<global_amount;i++)
{
globalArray[i] = randArray[i];
}
...
else if (choice == 3)
{
// clean up when you're done
free(globalArray);
system("clear");
return 0;
}
是一个无操作,这就是我们将其初始化为NULL的原因。