【发布时间】:2020-10-07 12:24:28
【问题描述】:
当在功能块的范围内定义时,这两种形式的相同变量应该具有相同的范围,即在定义它们的功能块 {...} 内:
char str1[] = "int_1 < int_2";
char *str1 = "int_1 < int_2";
但我的观察是char * 存在于函数范围之外,而char [] 不再存在。在这两种情况下,符号名称str1 都指向内存中创建变量的位置,那么为什么一个似乎存在于函数之外,而另一个却没有呢?以下代码可用于测试此行为:(将 #define 从 0 更改为 1 选择一种形式而不是另一种形式进行说明。)
还要注意,虽然static 修饰符可以用来修改作用域,但这里故意不使用它来观察没有它的行为。
#define DO (1) //define as either 1 or 0
char * compare_int(int x1, int x2);
int main(void)
{
int a = 0;
int b = 0;
int c = '\n';
srand(clock()/CLOCKS_PER_SEC);
while(c != 'q')
{
a = rand()%3;
b = rand()%3;
printf("%s\n( enter 'q' to exit. )\n\n", compare_int(a, b));
c = getchar();
}
return 0;
}
char * compare_int(int x, int y)
{
printf("%d %d\n", x, y);
#if(DO)
char str1[] = "int_1 < int_2";
char str2[] = "int_1 == int_2";
char str3[] = "int_1 > int_2";
#else
char *str1 = "int_1 < int_2";
char *str2 = "int_1 == int_2";
char *str3 = "int_1 > int_2";
#endif
return x < y ? (str1) : x == y ? (str2) : (str3);
}
我已经阅读了this,它确实回答了这个问题的一些关键部分,但是我的代码中的任何 UB 上的 cmets 和/或指向 C99 或更新标准的引用指向了区分这两种形式也将不胜感激。
【问题讨论】:
-
提供的代码如何作为指针和数组驻留在不同存储/属于不同范围的示例?您是一位经验丰富的 C 用户。这些担忧是如何产生的?
-
@RobertSsupportsMonicaCellio - 通过观察,您的第二条评论。当在
main()中的rintf()语句中调用时,指针始终超出函数的生命周期,而char []则不然。这就是为什么我追求这一点的原因,并且对 UB 是否参与我的观察感兴趣。关于“你是一个有经验的 C 用户。这些问题是怎么来的”,LOL,我有一些经验,但距离成为一名完美的 C 程序员还有很长的路要走。跨度> -
"指针始终存在于函数的生命周期之外..." - 不,它没有。返回的只是字符串文字的第一个元素的地址,它本身一直存在到程序终止。这并不意味着
strN的对象本身还活着。 -
@RobertSsupportsMonicaCellio - 明确区分。谢谢。 (您的一些观察将添加到这里的答案内容)
-
我不太明白你到底问了什么,因为我很困惑,想知道你的意思是什么。这就是我没有回答的原因。我想你可能会发现一些邪恶的记忆黑客。