从不同大小的整数转换为指针

时间:2013-02-22 14:26:45

标签: c string pointers casting warnings

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 个答案:

答案 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修复了这个。