在阅读了一些文章后,我提出了几个问题:
当我有一个未初始化的指针时,我无法放入它,因为没有内存分配的地方!
当我有一个指向char类型的变量的指针,并且我想用%s
放入它时,程序允许我放置两个字符(2个字节)以及更多,这给我打印错误。
我的问题是,当char只能容纳一个字节时,为什么可以将它放入两个字母?程序是不是应该落两个字母?
它不能将字符串放入这样的数组中:arr =“aaa”因为arr实际上是地址而不是可以保存char值的变量?
我读了一些关于undefined behavior
的内容,是否可以理解有一个折扣不会使用字符串的字符串指针,因此指向字符串的字符串的打印行为在意想不到的方式?
答案 0 :(得分:1)
1.这可能与对齐有关。如果char变量后面有多字节类型,则中间可能存在少量未使用的字节,但您不能依赖它,因为它显然是未定义的。
我建议使用valgrind检查内存问题,而不是依赖观察。
2.这里的区别在于
char *s = "Hello world";
将Hello世界放在内存的只读部分中,并使s
指向该内存,使得对此内存的任何写入操作都是非法的。在做的时候:
char s[] = "Hello world";
将文字字符串放在只读内存中,并将字符串复制到堆栈上新分配的内存中。从而制作
s[0] = 'J';
合法的。
3.没有字符串指针,char指针也用于字符串。如果要指向字符串,则使用char指针。问题是你试图在一个地方存储两个字母。