gpt4 book ai didi

c - 为什么 GCC 编译器允许我们声明零长度字符串(直接)和负长度字符串(间接)?

转载 作者:太空宇宙 更新时间:2023-11-04 01:18:12 26 4
gpt4 key购买 nike

/*implementation of strrev i.e. string reverse function*/

#include<stdio.h>
#include<string.h>

/*length of the string i.e. cells in the string*/
static const unsigned int MAX_LENGTH = 100;
//static const int MAX_LENGTH = -100;

/*reverses the string*/
void reverseString(char[]);
/*swaps the elements in the cells of a string*/
void swap(char[], int, int);

/*runs the program*/
int main()
{
char string[MAX_LENGTH];
//char string[0]; //no error!
//char string[-1]; //error!

gets(string);
reverseString(string);
printf("\n%s", string);

return 0;
}

void reverseString(char string[])
{
int i;
for(i = 0; i < (strlen(string) / 2); i++)
{
swap(string, i, (strlen(string) - 1 - i));
}
}

void swap(char string[], int i, int j)
{
int temp = string[i];
string[i] = string[j];
string[j] = temp;
}

看main函数。如果替换第一行“char string[MAX_LENGTH];”使用“char string[-1];”,编译器显示错误。 (因为负长度的字符串没有意义)。但是,如果将这段代码的第 7 行(我声明 const MAX_LENGTH 的地方)替换为第 8 行注释中编写的代码(其中 MAX_LENGTH 被分配了一个 -ve 值),则不会出现编译错误。为什么?

另外,为什么声明零长度字符串没有错误。零长度字符串如何对编译器有意义而不是负长度字符串?

最佳答案

因为这不是一回事。

  • 在第一种情况下,您要定义一个数组,使用固定的编译时大小
  • 在第二种情况下,您要定义一个可变长度数组 或 VLA。

在第二种情况下,编译器在运行时进行分配(使用这个 -100 值不会很好地结束),因为 const 不是在 C 中并不是一个常量,它只是告诉编译器您不要更改该值(并且还允许进行一些优化)。所以结果是未定义的行为(更多信息在这里:Declaring an array of negative length)

如果您想要相同的行为,请使用 #define

 #define MAX_LENGTH -100    // will raise a compilation error

或者如评论中所建议的,一个枚举常量:

enum { MAX_LENGTH = -100 };    // will raise a compilation error

如果你想保护你的声明,使用assert

assert(MAX_LENGTH > 0);
char string[MAX_LENGTH];

关于零长度元素,已经回答过的就不用重复了:What's the need of array with zero elements? (简而言之,它在结构的末尾很有用,能够具有不同的长度)

关于c - 为什么 GCC 编译器允许我们声明零长度字符串(直接)和负长度字符串(间接)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51946014/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com