0

文字の 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) は正しいアドレスを指しています。

ありがとう、

4

1 に答える 1

6

char **a_ptr = &ary;- これは意味がありません。char** a_ptrポインタへのポインタです。必要なのは、配列へのポインタです。次のようになります。

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

ポインター アドレスを出力しようとしている場合はprintf、この の形式があります%p0x%xを に置き換えます%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;
}
于 2013-06-18T02:43:03.043 に答える