1
client_t *client_create_no_window(char *in, char *out); 

// ...

char line[50];
while((c = getchar()) != EOF && c != '\n')
{
    line[pos] = c;
    pos++;
}
pos=0;

然后我尝试client_create_no_window通过首先调用该函数

char* first = (char*) line[1];
char* second= (char*) line[2];
client_create_no_window(first, second);

我不断收到从不同大小的整数转换为指针的错误。我已经看过一些以前关于这些的帖子,但仍然无法理解为什么会这样

4

4 回答 4

2
char line[50];

定义一个字符数组。第二个字符 ( line[1]) 存储在内存中的地址处,可以使用“地址”运算符 ( &):来检索该地址&line[1]

char* second = (char*) line [1];

获取第二个字符 ( line[1]) 并将其转换为指向 的指针char,这是不正确的。指向第二个字符的指针应使用该字符所在的地址进行初始化:

char* second = &line[1];
于 2013-02-22T14:33:20.883 回答
2

这:

char*first = (char*) lines[1];

获取at的字符lines[1],通过强制转换将其转换为char *(指向字符的指针,即地址),并将其存储在字符指针first中。

这是错误的,因为字符不是地址,所以这个赋值没有意义。

您想要的可能是该字符的地址,您可以使用“address of”运算符获得&

char *first = &lines[1];

也可以使用指针算术编写为:

char *first = lines + 1;

但是请注意,C 索引从零开始,因此第一个字符实际上位于lines[0]

char *first = &lines[0];

第二是在lines[1]

char *second = &lines[1];
于 2013-02-22T14:36:18.060 回答
1

首先,我确定这只是一个错字,但您声明char lines[]了而不是char line[]. 其次,您是否要将 的地址line[0]放入first?那将是:

char *first = line;

或者

char *first = &line[0];

相似地:

char *second = &line[1];

请注意,第一个和第二个字符分别位于索引 0 和 1 处。

于 2013-02-22T14:36:46.907 回答
0

如下更改您的代码(假设您真的试图将指针分配给 line[1] 和 line[2] 的值)。如果你想指向 line[1] 和 line[2] 的地址,你可以像上面描述的那样做 &line[] 并且你不必使用 reinterpret_cast 来停止关于大小的警告消息:

line[1] = 2;
line[2] = 0x234234;

char* first = reinterpret_cast<char *>(line[1]);
char* second= reinterpret_cast<char *>(line[2]);
client_create_no_window(first, second);

第一个将指向 0x000002 第二个将指向 0x234234

reinterpret_cast 获取值并将其转换为给定指针的类型和大小。在较旧的编译器中,只需执行 char *ptr = (char *)23 就足够了,但新编译器知道 int(23 将存储在 int 中)不是指针的大小(通常为 64 位),它会生成警告信息。reinterpret_cast 解决了这个问题。

于 2016-04-15T18:11:30.533 回答