无法将char分配给char指针
这是我的密码:无法将char分配给char指针,c,arrays,pointers,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:)行未初始化,而tmp1初始化错误 应该是: char lines[2]; char * t
printf("%s\n", "test1");
char c = '2';
char * lines[2];
char * tmp1 = lines[0];
*tmp1 = c;
printf("%s\n", "test2");
我在控制台中没有看到第二个printf
问题:有人能解释一下我的代码有什么问题吗
注意:我正在尝试学习
C
:)行
未初始化,而tmp1
初始化错误
应该是:
char lines[2];
char * tmp1 = lines;
或者,你可以说:
char * tmp1 = &lines[0];
或者对于字符串数组:
char lines[2][30];
char * tmp1 = lines[0];
行
未初始化,tmp1
初始化错误
应该是:
char lines[2];
char * tmp1 = lines;
或者,你可以说:
char * tmp1 = &lines[0];
或者对于字符串数组:
char lines[2][30];
char * tmp1 = lines[0];
未初始化中的数组
行
。因此,行[0]
是一个非斜体指针。在*tmp1
中取消对它的引用完全是未定义的行为
这里有一个替代方案,它可能与您想要的对应,也可能与您想要的不对应:
char lines[2];
char * tmp1 = lines; // or "&lines[0]"
*tmp = c;
或者,更容易:
char lines[2] = { c, 0 };
未初始化中的数组
行
。因此,行[0]
是一个非斜体指针。在*tmp1
中取消对它的引用完全是未定义的行为
这里有一个替代方案,它可能与您想要的对应,也可能与您想要的不对应:
char lines[2];
char * tmp1 = lines; // or "&lines[0]"
*tmp = c;
或者,更容易:
char lines[2] = { c, 0 };
线路
char * lines[2];
创建两个字符指针的数组。但这并不分配内存,它只是内存中指针的“句柄”或“名称”。指针没有指向有用的东西
您必须使用malloc()
分配内存:
或者告诉编译器为您分配内存:
char lines[2];
注意:在使用字符串之前,不要忘了用0
字节终止字符串。行
char * lines[2];
创建两个字符指针的数组。但这并不分配内存,它只是内存中指针的“句柄”或“名称”。指针没有指向有用的东西
您必须使用malloc()
分配内存:
或者告诉编译器为您分配内存:
char lines[2];
注意:在使用字符串之前,不要忘记用0
字节终止字符串。此行:
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 */
这一行:
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 */
char*行[2]代码>:字符指针的两元素数组
char*tmp代码>:指向字符的指针
char*tmp=lines[0]
:将行
数组的数组元素0
中的值传输到tmp
。因为它是一个自动数组,所以它将垃圾作为行[0]
的值
*temp
:取消对垃圾值的引用。未定义的行为。代码>字符*行[2]代码>:字符指针的两元素数组
char * tmp1 = lines[0];
char*tmp代码>:指向字符的指针
char*tmp=lines[0]
:将行
数组的数组元素0
中的值传输到tmp
。因为它是一个自动数组,所以它将垃圾作为行[0]
的值
*temp
:取消对垃圾值的引用。未定义的行为
char * tmp1 = lines[0];
这里声明一个char指针,并将其指针值初始化为第[0]行,这是存储在line数组中的第一个元素,也是未初始化的
现在tmp指向未知的、实际上无法访问的地方。当你
*tmp1 = (char)c;
您操作的内存地址无效,导致分段错误
这里声明一个char指针,并将其指针值初始化为第[0]行,这是存储在line数组中的第一个元素,也是未初始化的
现在tmp指向未知的、实际上无法访问的地方。当你
*tmp1 = (char)c;
您操作的内存地址无效,导致分段错误