特定数组

时间:2017-01-04 12:56:41

标签: c arrays

我有一个算法,它应该显示两个数组是否相似。它有效,但我不知道数组的大小应该是什么。

例如:

int a[10], i = 0, r = 0, n = 0;
printf("Enter the amount of numbers in arrays: ";
scanf("%d", &n);

printf("Enter the numbers of array: ";
for (i = 0; i < n; i++)
{
   scanf("%d", &a[i]);
}

如果输入“n”变量n = 11,程序将在结束时停止。我的问题是:我应该为数组添加一个数字[ THAT_PLACE ],以确保该程序与大多数硬件兼容(我听说这也取决于内存。)

@ UPDATE1:

我选择了 alk 解决方案。但它仍然无效。这是我的代码:

int main()
{

int i = 0, temp_a = 0, switch_a = 0, temp_b = 0, switch_b = 0, n = 0;

printf("Enter the amount of numbers in arrays: ");
scanf("%d", &n);
{
    int a[n], b[n];
    printf("Enter elements of first array: ");
    for (i = 0; i < n; ++i)
    {
        scanf("%d", &a[i]);
    }
    printf("Enter elements of second array:  ");
    for (i = 0; i < n; ++i)
    {
        scanf("%d", &b[i]);
    }
    do
    {
        switch_a = 0;
        for (i = 0; i < n - 1; i++)
        {
            if (a[i] > a[i + 1])
            {
                switch_a = switch_a + 1;
                temp_a = a[i];
                a[i] = a[i + 1];
                a[i + 1] = temp_a;
            }
        }
    } while (switch_a != 0);
    //bubble sort
    do
    {
        switch_b = 0;
        for (i = 0; i < n - 1; i++)
        {
            if (b[i] > b[i + 1])
            {
                switch_b = switch_b + 1;
                temp_b = b[i];
                b[i] = b[i + 1];
                b[i + 1] = temp_b;
            }
        }
    } while (switch_b != 0);
    //Cheks, if an arrays are the same. 
    for (i = 0; i < n; i++)
    {
        if (a[i] != b[i])
        {
            printf("This two arrays don't have the same elements.\n\n\n");
            return 0;
        }
    }

    printf("This two arrays have the same elements.\n\n\n");
}

return 0;

}

你可以帮我查一下吗?我找不到有什么问题......

3 个答案:

答案 0 :(得分:2)

您的数组a只能包含10个int。因此,如果您输入n为11,那么由于越界访问,您有undefined behaviour

您可以使用C99 VLA(可变长度数组)或使用malloc()系列函数使用动态内存分配。

注意:VLA在C11中是可选的。因此,您可能希望使用宏__STDC_NO_VLA__来检查您的实现是否不支持它。

VLA的潜在问题(具有自动存储持续时间 - 通常称为“堆栈”)是很难确定大型阵列的分配是否成功。

答案 1 :(得分:2)

如果您不能(或您不想)使用VLA,请使用malloc:man malloc

示例:

int *buffer;
int dim;

printf("Enter the amount of numbers in arrays: ");
scanf("%d", &dim);
buffer = (int*) malloc(sizeof(int) * dim);
if (buffer == NULL) {
   perror("Malloc error");
   exit(-1);
}

有关malloc的更多信息:Stack Overflow: How do malloc() and free() work?

答案 2 :(得分:1)

如果您使用的C实现支持可变长度数组,那么只需执行:

int i = 0, r = 0, n = 0;
printf("Enter the amount of numbers in arrays: ";
scanf("%d", &n);

{
  int a[n];
  printf("Enter the numbers of array: ";
  for (i = 0; i < n; i++)
  {
    scanf("%d", &a[i]);
    ...