关于char指针初始化

时间:2014-02-21 06:48:35

标签: c pointers char

案例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"。怎么样?

我知道这是基本的,但是在我的脑海中仍然存在一些混乱,这在考虑记忆方面没有给我一个明显的区别。请告知并随意纠正我。

2 个答案:

答案 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"的地址。