【发布时间】:2016-09-19 21:41:44
【问题描述】:
谁能解释一下:
#include <stdio.h>
void some_fn(char *x)
{
printf("%d\n", x);
}
int main()
{
// They are stored on the same memory address
some_fn("A");
some_fn("A");
some_fn("B");
}
为什么会:
some_fn("A");
some_fn("A");
打印存储在同一个内存地址吗?
【问题讨论】:
-
因为
"A"是一个字符串文字,它很可能进入程序的只读部分,并且编译器足够聪明,可以实现"A"和"A"是同一个字符串,因此它只存储一次并在任何时候使用该地址。此外,使用printf("%p"...)打印出指针 -
更好的问题是为什么不应该将它们存储在同一个地址中?
-
而且您没有将任何
chars 传递给您的函数。您正在传递指向char的指针,正如它所需要的那样。这些指针是字符串字面量(char的数组)衰减为指针的结果,就像任何数组值作为函数参数出现时一样。 -
如果您执行了
char str[] = "A";,这将强制编译器创建字符串文字初始值设定项的可修改副本。 (它仍然可以优化它,因为它可以内联some_fn并看到你没有做任何需要单独副本的事情)。const char str[] = "A";可能不会导致任何浪费的复制。 -
@Barmar 我确实认为,我最初认为:由于字符串文字不能更改,那么编译器会认为它们是相同的东西并使用现有的而不是分配更多的记忆,但后来我想我最好不要猜测并问别人。
标签: c memory memory-management cpu-architecture