我正在学习C语言中的指针-专门针对此问题,包括指针和通用指针。
我有以下代码
void genericPointers()
{
char* words[4]; // some strings
void *gp; //this is the generic pointer - it needs to be casted
// initialize our string array
words[0] = "zero";
words[1] = "one";
words[2] = "two";
void **gpp;
(char**)gpp = words;
(char *)gp = *gpp;
for (size_t i = 0; i < 3; i++)
{
(char**)gpp = (char **)gpp + i;
(char *)gp = *(char**)gpp;
while (*(char*)gp != 0)
printf("%c ", *((char *)gp)++);
printf("\n");
}
}
对于数组的前2个元素,它工作正常,但是对于words[2]
,gpp
在上次迭代中未正确递增,并且加载了[0xcccccccc]
,我得到了(访问冲突)异常。有人可以解释第一个words[0]
和words[1]
很好,但不能解释words[2]
吗?
预期的输出结果是,该数组的所有元素都将在每个字符之间打印一个空格。
答案 0 :(得分:1)
代码有很多问题,您在编译代码时是否启用了警告?除了所有警告以外,您的问题的答案是您将指针增加的数量超过了要求
(char**)gpp = (char **)gpp + i;
当i = 0时,gpp = gpp
当i = 1时,gpp = gpp +1-gpp现在已修改(gpp-> word [1])
当i = 2时,gpp = gpp + 2 <-gpp现在指向数组外(它将以单词[1]开头2个元素)
解决方案是使用临时变量而不是修改gpp。
答案 1 :(得分:0)
此
(char**)gpp = words; /* results in lvalue error */
是错误的。您不能像以前那样打字。编译器可能会通知您
错误:左值必须作为赋值的左操作数
替换上方
gpp = (void**)words;
与gp
相同,替换为
gp = *(char*)gpp;
在for
循环中也不要修改gpp
。你可以像
gp = *((char**)gpp + i);
这是示例代码
void genericPointers(void){
char* words[4];
void *gp;
// initialize our string array
words[0] = "zero";
words[1] = "one";
words[2] = "two";
void **gpp;
gpp = (void**)words; /* typecast word as void** not as char** */
gp = *(char**)gpp;
for (size_t i = 0; i < 3; i++) {
gp = *((char**)gpp+i); /* this is important */
while (*(char*)gp != 0)
printf("%c ", *(char *)gp++);
printf("\n");
}
}
int main(void) {
genericPointers();
return 0;
}