char str[]中花括号内的值的意义是什么?

4

明确一点,我并不是在问char *str和char str[]之间的区别。我甚至比那还要初学者。我正在实现以下代码:

// Convert long long to string 
    char number_str[];
    sprintf(number_str, "%lld", number_ll);

当我运行printf("%s\n", number_str);时,不管我在括号中放2还是256,它都会输出正确的数字。这让我想问一下,这些括号是干什么用的?
这篇帖子中,我了解到了char str[]

1
那个代码真的编译通过了吗?不应该的。 - Keith Thompson
2个回答

3
当我运行printf("%s\n", number_str);时,无论我在括号内放置2还是256,它都会输出正确的数字。这让我想问,这些括号是干什么用的?
这是因为您的代码调用了未定义的行为。您没有为数组分配空间。
在char str[]的大括号中放置的值的意义是什么?
这意味着您要为数组分配多少空间。但请注意,当使用初始化程序时,可以省略该值,即数组的长度(在多维数组的情况下为第一维)。

通常是以字节(word)为单位。 - haccks
它能接受一个变量吗?(顺便说一下,如果有一些文档可以让我成为这个社区更负责任的成员,请提供链接。我不想滥用在这里得到的帮助。) - Crowder
是的。一旦您声明了一个数组,那么您就可以使用变量作为索引。C99还允许可变长度数组(VLAs)。 - haccks
顺便说一句,如果有一些文档可以让我成为这个社区更负责任的成员,请给我提供链接。我不想滥用在这里得到的帮助:阅读这个:http://stackoverflow.com/tour 和这个:http://stackoverflow.com/help。它将会在未来对你有所帮助。祝你好运 :) - haccks
2
@haccks:它在元素中,这种情况下是字节。而一个WORD不一定是一个字节(现在很少见)。 - Ed S.
@EdS。是的。谢谢你添加这个。 :) - haccks

2
在数组声明中,方括号 [] 中的数字表示数组中元素的数量。
你问题中的代码:
char number_str[];
sprintf(number_str, "%lld", number_ll);

在函数定义内出现空括号是非法的,你需要指定数组的大小。调用 sprintf 或任何其他函数必须出现在函数定义内。

如果你指定了数组的大小:

char number_str[100];
sprintf(number_str, "%lld", number_ll);

创建一个对象number_str,它是由100个char元素组成的数组。如果你把数组创建得太小:

char number_str[3];
sprintf(number_str, "%lld", number_ll); /* let's say number_ll == 12345 */

如果你这样做,你的程序可能看起来能够工作,但实际上它的行为是未定义的。 sprintf 调用将尝试在一个长度为 3 的数组中存储 6 个字符。

C 编译器没有义务诊断此错误。它很可能会让你尝试这样做,导致数据被写入你不拥有的内存区域。

在文件范围内,你可以声明类似于:

extern char array[];

这段文字指定了一个名为array的对象,类型为数组(大小未指定),其中存储char类型的元素,并且该对象在其他地方定义。

作为(有些烦人的)特例,以数组语法定义的函数参数实际上是一个指针:

void func(char param[42]) {
    /* param is a pointer; the 42 is silently ignored */
}

请记住,数组和指针是两个不同的概念。关于它们之间有些令人困惑的关系,请参见comp.lang.c FAQ第6节的说明。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接