无法将char指定给char指针

时间:2012-09-03 07:54:11

标签: c arrays pointers

这是我的代码:


    printf("%s\n", "test1");
    char c = '2';
    char * lines[2];
    char * tmp1 = lines[0];

    *tmp1 = c;
    printf("%s\n", "test2");

我在控制台中看不到第二个printf

问题:有人能解释一下我的代码有什么问题吗?

注意:我正在尝试学习C:)

6 个答案:

答案 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;

您正在使用无效的内存地址进行操作,这会导致分段错误。