数组的最后一个元素中的通用指针访问冲突

时间:2018-07-02 12:40:47

标签: c pointers generics

我正在学习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]吗?

预期的输出结果是,该数组的所有元素都将在每个字符之间打印一个空格。

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;

}