【问题标题】:C Access 2D char array via PointerC通过指针访问二维字符数组
【发布时间】:2013-06-18 02:27:05
【问题描述】:

我正在尝试访问 2D 字符数组。我有一个指向正确地址的指针,但不知何故,引用不起作用。

    char ary[5][8];
char temp[8];
int i;

char **a_ptr = &ary;

    for(i=0; i<5; i++){
        sprintf(temp, "0x10%d" , i);
        strcpy(ary[i] , temp);
        printf("~~~%s@0x%x == 0x%x" , ary[i] , &ary[i] , (a_ptr + i));

    }

    for(i=0; i<5; i++){//This wont work. 
        printf("~~~%s@0x%x" , *(a_ptr + i) ,  (a_ptr + i));

    }

下面是这个函数在解除指针中断之前的输出。

输出格式:值@地址

0x100@0x5fbff408 == 0x5fbff408
0x101@0x5fbff410 == 0x5fbff410
0x102@0x5fbff418 == 0x5fbff418
0x103@0x5fbff420 == 0x5fbff420
0x104@0x5fbff428 == 0x5fbff428

正如我们在上面的输出中看到的那样,数组值被正确填充并且 a_ptr 指向正确的地址 (&ary[i] == (a_ptr + i))。

但是当指针是尊重时,它会在那里中断。即使使用 [] 运算符也是如此。

*(a_ptr + i); //Breaks
a_ptr[i]; //Breaks as well

但是,(a_ptr + i) 指向正确的地址。

谢谢,

【问题讨论】:

    标签: c pointers multidimensional-array


    【解决方案1】:

    char **a_ptr = &amp;ary; - 这毫无意义。 char** a_ptr 是指向指针的指针。你需要的是一个指向数组的指针。以下将做:

    char (*a_ptr)[8] = ary; // also don't take the address of the array
    

    如果您尝试打印指针地址,printf 具有此 %p 的格式。将您的 0x%xs 替换为 %p

    我已将您的代码编辑如下,我的编译器不再发出警告:

    #include <stdio.h>
    #include <string.h>
    
    int main()
    {
        char ary[5][8];
        char temp[8];
        int i;
    
        char (*a_ptr)[8] = ary;
    
        for(i=0; i<5; i++)
        {
            sprintf(temp, "0x10%d" , i);
            strcpy(ary[i] , temp);
            printf("~~~%s@%p == %p" , ary[i] , &ary[i] , (a_ptr + i));
    
        }
    
        for(i=0; i<5; i++)
        {
            printf("~~~%s@%p" , *(a_ptr + i) ,  (a_ptr + i));
        }
    
        return 0;
    }
    

    现在我的输出是:

    $ ./a.out 
    ~~~0x100@0xbfc77a74 == 0xbfc77a74~~~0x101@0xbfc77a7c == 0xbfc77a7c~~~0x102@0xbfc77a84 == 0xbfc77a84~~~0x103@0xbfc77a8c == 0xbfc77a8c~~~0x104@0xbfc77a94 == 0xbfc77a94~~~0x100@0xbfc77a74~~~0x101@0xbfc77a7c~~~0x102@0xbfc77a84~~~0x103@0xbfc77a8c~~~0x104@0xbfc77a94
    

    这是你希望得到的吗?

    一些只依赖指针而不依赖数组的代码:

    #include <stdio.h>
    #include <string.h> /* for strcpy */
    #include <stdlib.h> /* for free and malloc */
    
    int main()
    {
    
        char** two_d = malloc(sizeof(char*) * 5); /* allocate memory for 5 pointers to pointers */
    
        int i;
        for(i = 0; i < 5; i++) /* for each of the five elements */
        {
            two_d[i] = malloc(2); /* allocate memory to each member of two_d for a 2 char string */
    
            strcpy(two_d[i], "a"); /* store data in that particular element */
    
            printf("%s has address of %p\n", two_d[i], &two_d[i]); /* print the contents and the address */
    
            free(two_d[i]); /* free the memory pointer to by each pointer */
        }
    
        free(two_d); /* free the memory for the pointer to pointers */
    
        return 0;
    }
    

    【讨论】:

    • 是的,它工作得很好,输出正是预期的。但是不想使用指向数组的指针 (char a_ptr[8]) 并且想要坚持使用指向指针的指针,因为它是相同的。好的,问题在于取消引用。 printf("~~~%s@%p" , (a_ptr + i) , (a_ptr + i));如果没有 '' 运算符的尊重,则可以访问这些值。坦率地说,我不知道为什么会这样。 *(a_ptr + i) 语法不应该工作吗?或者 a_ptr[i] 也应该可以工作。
    • char ary[5][8] 只为 40 个字符分配内存,没有指针。如果您想要指向指针的指针,则声明char *ary[5],然后用指向 8 个字符的不同指针初始化这五个指针中的每一个。指针不是数组。
    • 那么下面的howcome可以工作。字符 **a_ptr = &ary; printf("~~~%s@%p" , (a_ptr + i) , (a_ptr + i));这将正确显示值。但是,取消引用仍然不起作用!
    • 我真的不相信它有效,编译器发出警告:'警告:从不兼容的指针类型初始化[默认启用]'。当我运行您的原始代码(带有打印指针地址的修复程序)时,我遇到了分段错误。这是 Linux 上的 GCC。
    • @Nobilis 也许你是对的。有趣的是,它适用于 i686-apple-darwin11-llvm-gcc-4.2 编译器。至少我可以看到正确的输出。但它肯定会在这里中断codepad.org/6hamacpH 知道发生了什么吗?
    猜你喜欢
    • 1970-01-01
    • 2014-07-26
    • 2010-09-25
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    • 2013-02-13
    • 1970-01-01
    相关资源
    最近更新 更多