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);
我不断从不同大小的整数中获取错误。我已经看了一些以前关于这些的帖子,但仍然无法理解为什么会这样做
答案 0 :(得分:2)
char line[50];
定义一个字符数组。第二个字符(line[1]
)存储在内存中的地址,可以使用“运算符(&
)的地址检索:&line[1]
。< / p>
char* second = (char*) line [1];
获取第二个字符(line[1]
)并将其强制转换为指向char
的指针,这是不正确的。应使用此字符所在的地址初始化指向第二个字符的指针:
char* second = &line[1];
答案 1 :(得分:2)
此:
char*first = (char*) lines[1];
在lines[1]
获取字符,通过强制转换将其转换为char *
(指向字符的指针,即地址),并将其存储在字符指针中{ {1}}。
这是错误的,因为字符不是地址,这个分配没有意义。
您想要的可能是该角色的地址,您可以使用“地址”运算符first
来获取该地址:
&
也可以使用指针算法编写:
char *first = &lines[1];
但请注意,C索引从零开始,因此第一个字符实际上位于char *first = lines + 1;
:
lines[0]
和第二个位于char *first = &lines[0];
:
lines[1]
答案 2 :(得分:1)
首先,我确定这只是一个错字,但你宣布char lines[]
而不是char line[]
。其次,您是否想将line[0]
的地址放入first
?那将是:
char *first = line;
或者
char *first = &line[0];
类似地:
char *second = &line[1];
请注意,第一个和第二个字符分别位于索引0和1处。
答案 3 :(得分:0)
更改代码如下(假设您确实尝试将指针指定给line [1]和line [2]的值)。如果你想指向行[1]和行[2]的地址,你将按照上面的描述执行&amp; 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修复了这个。