关于C中的字符串和指针的几个问题

时间:2014-07-23 05:31:04

标签: c arrays string pointers undefined-behavior

在阅读了一些文章后,我提出了几个问题:

  1. 当我有一个未初始化的指针时,我无法放入它,因为没有内存分配的地方! 当我有一个指向char类型的变量的指针,并且我想用%s放入它时,程序允许我放置两个字符(2个字节)以及更多,这给我打印错误。 我的问题是,当char只能容纳一个字节时,为什么可以将它放入两个字母?程序是不是应该落两个字母?

  2. 它不能将字符串放入这样的数组中:arr =“aaa”因为arr实际上是地址而不是可以保存char值的变量?

  3. 我读了一些关于undefined behavior的内容,是否可以理解有一个折扣不会使用字符串的字符串指针,因此指向字符串的字符串的打印行为在意想不到的方式?

1 个答案:

答案 0 :(得分:1)

1.这可能与对齐有关。如果char变量后面有多字节类型,则中间可能存在少量未使用的字节,但您不能依赖它,因为它显然是未定义的。

我建议使用valgrind检查内存问题,而不是依赖观察。

2.这里的区别在于

char *s = "Hello world"; 将Hello世界放在内存的只读部分中,并使s指向该内存,使得对此内存的任何写入操作都是非法的。在做的时候:

char s[] = "Hello world"; 将文字字符串放在只读内存中,并将字符串复制到堆栈上新分配的内存中。从而制作

s[0] = 'J'; 合法的。

3.没有字符串指针,char指针也用于字符串。如果要指向字符串,则使用char指针。问题是你试图在一个地方存储两个字母。