案例1:
char *str = {"one", "two", "three"};
puts(str); // displays one
Q1:我们如何在char*
中存储一个字符串数组。它在内部如何运作?我们怎样才能显示两个。
案例2:
根据我的理解,str是一个指向角色的指针。因此,它将存储一个字符的地址。现在它取决于我们如何打印它。
char *str2 = "Hello";
printf("%c", *str2); // display H [displays the char pointed by the string]
printf("%s", str2); // display Hello [basically looks for '\0' to stop printing]
Q2:我们如何区分str
(上方)和str2
?
Q3:指针变量str2
存储在堆栈中。是吗? "Hello"
存放在哪里?
案例3:
char *str3 = malloc(sizeof(char));
str3 = "Yellow";
puts(str3);
Q4:str3
在堆栈上,它指向堆中的内存块(1个字节)。这是对的吗?我仍然可以存储"Yellow"
。怎么样?
我知道这是基本的,但是在我的脑海中仍然存在一些混乱,这在考虑记忆方面没有给我一个明显的区别。请告知并随意纠正我。
答案 0 :(得分:2)
我们如何在char *中存储字符串数组。它在内部如何运作?我们怎样才能显示两个。
除了char *中的地址外,您不能存储任何内容。但是,您可以分配一个char *指针数组,每个指针指向一个字符串。执行此操作时,应将数组声明为const
,因为不允许通过指针修改字符串文字。
const char* str[3] = {"one", "two", "three"};
for(int i=0; i<3; i++)
puts(str[i]);
我们如何区分str(上面)和str2?
使用不同的语法,它们是不同的东西。你的第一个例子只指向一个字符串“one”。初始化程序列表中的其他两个字符串被编译器丢弃。你应该对此发出警告。
指针变量str2存储在堆栈中。是吗?
是
“Hello”存储在哪里?
在程序的只读内存部分,通常称为.rodata
(只读数据)。同样,这就是为什么你应该将所有这些指向字符串文字的指针声明为const
。
str3在堆栈上,它指向堆中的内存块(1个字节)。这是对的吗?
是
我仍然可以存储“黄色”。怎么样?
你没有存放任何东西。您可以在指针中存储的唯一内容是地址。因此,当您编写str3 = "Yellow";
时,您告诉程序:忘记我刚刚分配的堆内存,让我们指向这个只读字符串。所以你创建了一个bug,一个内存泄漏,因为没有任何东西指向那个堆段。
答案 1 :(得分:1)
案例1:
usuall / normal用法是
char *str[] = {"one", "two", "three"};
puts(str[0]); // "one"
puts(str[1]); // "two"
案例2:
Q3:指针变量str2存储在堆栈中。是吗? “Hello”存储在哪里?
如果str2
是局部变量,是的,它存储在堆栈中;但如果它是全局变量,它将存储在数据段中。 “Hello”存储在某个(只读)数据段中。
案例3:
Q4:str3在堆栈上,它指向堆中的内存块(1个字节)。这是对的吗?
是
我仍然可以存储“黄色”。怎么样?
您没有将“黄色”存储到分配前指向的内存中。在char *str3 = "Yellow";
中,str3
将获得"Yellow"
的地址。