这是我的代码:
printf("%s\n", "test1");
char c = '2';
char * lines[2];
char * tmp1 = lines[0];
*tmp1 = c;
printf("%s\n", "test2");
我在控制台中看不到第二个printf
。
问题:有人能解释一下我的代码有什么问题吗?
注意:我正在尝试学习C
:)
答案 0 :(得分:4)
这一行:
char * lines[2];
声明一个包含两个char
指针的数组。但是,您实际上并没有初始化指向任何内容的指针。所以稍后当你执行*tmp1 = (char)c;
时,你将字符c
分配给内存中的某个地方,甚至可能地址为零(即NULL
),这是一件坏事。
解决方案是将数组创建为数组数组,如
char lines[2][30];
这声明行有两个30个字符的数组,因为字符串需要一个特殊的终结符,所以最多可以包含29个字符的字符串。
第二种解决方案是为字符串动态分配内存:
char *lines[2];
lines[0] = malloc(30);
lines[1] = malloc(30);
本质上,这与上面的数组数组声明相同,但是在堆上分配内存。
当然,也许你只想要一个单个字符串(加上终结符),那么你几乎是对的,只需删除星号:
char line[2]; /* Array of two characters, or a string of length one */
答案 1 :(得分:3)
lines
未初始化,tmp1
初始化错误。
应该是:
char lines[2];
char * tmp1 = lines;
或者,您可以说:
char * tmp1 = &lines[0];
或者对于一个字符串数组:
char lines[2][30];
char * tmp1 = lines[0];
答案 2 :(得分:3)
未初始化的数组lines
。因此lines[0]
是一个未经初始化的指针。在*tmp1
中取消引用它只是未定义的行为。
这是一个替代方案,可能与您想要的相符也可能不对应:
char lines[2];
char * tmp1 = lines; // or "&lines[0]"
*tmp = c;
或者,更容易:
char lines[2] = { c, 0 };
答案 3 :(得分:1)
该行
char * lines[2];
创建一个包含两个char指针的数组。但是这不会分配内存,它只是内存中指针的“句柄”或“名称”。指针不指向有用的东西。
您必须使用malloc()
分配内存:
char * lines = malloc(2);
或告诉编译器为你分配内存:
char lines[2];
注意:在使用之前,不要忘记使用0
字节终止字符串。
答案 4 :(得分:1)
char *lines[2];
:一个两元素的char指针数组。
char *tmp;
:指向角色的指针。
char *tmp = lines[0]
:0
数组的数组元素lines
内的值将传输到tmp
。因为它是一个自动数组,所以它会将垃圾作为lines[0]
的值。
*temp
:取消引用垃圾值。未定义的行为。
答案 5 :(得分:1)
char * tmp1 = lines[0];
这里你声明一个char指针并将其指针值初始化为line [0],第一个元素存储在行数组中,该元素也是未初始化的。
现在tmp指向某个未知的地方,实际上无法访问。当你
*tmp1 = (char)c;
您正在使用无效的内存地址进行操作,这会导致分段错误。