C中的数组大小错误

时间:2013-09-17 12:38:09

标签: c arrays

我写了一个程序来完成这些任务:首先从用户那里获取一个字符串,并用sizeof()函数计算它的大小。这是我的代码:

#include <stdio.h>
int main()
{
    char U1[];
    puts("Enter a string:");
    scanf("%s", U1);
    printf("The %s has %i bytes.", U1, sizeof(U1));
    return 0;
}

编译错误是:error: array size missing in ‘U1’ 为什么?请解释这里有什么问题?

5 个答案:

答案 0 :(得分:2)

您需要定义数组大小以告诉编译器要分配多少空间:

char U1[256];

如果在编译时不知道数组的大小,可以使用malloc动态分配内存:

// #include <stdlib.h>
int *arr;
int n, i;
printf("Number of elements: ");
scanf("%d", &n);

// Allocate n ints
arr  = malloc(n * sizeof(int));

printf("Enter %d elements: ", n);
for(i = 0; i < n; i++)
   scanf("%d", &arr[i]);

printf("Here they are: ");
for(i = 0; i < n; i++)
   printf("%d ", arr[i]);

// Free the array on the end!
free(arr);

注意

printf("The %s has %i bytes.", U1, sizeof(U1));

将始终打印256,因为sizeof返回在编译时扣除的数组的大小,而不是刚刚读入数组的字符数。您可以使用sizeof(char) * (strlen(U1) + 1)来计算字符串所需的字节数(+1来自字符串末尾的NUL-terminator字符)。

答案 1 :(得分:2)

C数组是固定长度的,因此每个数组在声明时都需要完全指定其大小。有效声明如下:

char U1[256];

请注意,如果用户输入的字符数超过该数字(减去终止零的一个字符),则该程序的行为未定义。要避免此问题,请将scanf("%s")替换为fgets()并了解dynamic arrays

答案 2 :(得分:0)

您需要为数组指定大小。 Scanf采用已经分配的数组并且不调整它的大小,只是用输入填充它。

您的代码应如下所示:

#include <stdio.h>
int main()
{
    char U1[256];
    puts("Enter a string:");
    scanf("%s", U1);
    printf("The %s has %i bytes.", U1, strlen(U1));
    return 0;
}

请注意,我没有使用sizeof,因为我将拥有数组的整个大小,而不仅仅是字符串。 strlen将为您提供以C结尾的字符串的大小。

答案 3 :(得分:0)

你应该制作一个特定的数组,正常的C编译不支持动态数组。

答案 4 :(得分:0)

C中的数组需要用大小声明。另一种选择是使用指针

的动态数组