Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法将char分配给char指针_C_Arrays_Pointers - Fatal编程技术网

无法将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;
您操作的内存地址无效,导致分段错误