[英]Access address of pointer in pointer-to-pointer array
4我試圖從指向指針數組的指針獲取指針地址,但是當我運行下面的代碼時,我只會得到垃圾。 如何從char **數組中檢索char *之一的指針地址? 感謝您對此進行檢查。
具體來說,我想通過“ what”獲取“ wh”的地址並將其分配給“ hi”。
char * hi;
char * wh;
char ** what;
int main(void) {
char z[4] = "wx\0";
char a[4] = "ab\0";
hi = &z;
wh = &a;
what = (char **) malloc( 25 * sizeof(char));
what[0] = &hi;
what[1] = &wh;
printf("%s | %s\n", hi, wh);
hi = &what[1];
printf("%s | %s\n", hi, wh);
return EXIT_SUCCESS;
}
更正的代碼:
#include <stdio.h>
#include<stdlib.h>
char * hi;
char * wh;
char ** what;
int main(void) {
char z[3] = "wx\0";
char a[3] = "ab\0";
hi = z;
wh = a;
what = malloc(2 * sizeof *what);
what[0] = hi;
what[1] = wh;
printf("%s | %s\n", hi, wh);
hi = what[1];
printf("%s | %s\n", hi, wh);
return 0;
}
hi
和wh
的類型&z
和&a
,即使它們應產生相同的值。 另外,您不希望hi
what[1]
是它所在的存儲位置的值。 另外,在C中,您無需強制轉換malloc的返回值。 但是,在C ++中,盡管更好地使用new
運算符,但仍需要強制轉換。
hi
和wh
被定義為指向char的指針 。 因此,請更改您的工作分配表
從,
hi = &z; /* Type of &z is pointer-to-array-of-4-char */ wh = &a; /* Type of &a is pointer-to-array-of-4-char */
至,
hi = z; /* Type of z is pointer-to-char. Array name, here, decays into pointer to first element of the array */ wh = a; /* Type of a is pointer-to-char */
what
被定義為類型, 指針指向char。 因此,更改您的malloc
語句
從,
what = (char **) malloc( 25 * sizeof(char)); /* what needs to hold char*'s, you have allocated only for char's */
至,
what = malloc(25 * sizeof *what); /* what is of type char**. *what gives you char* */
另外,更改您的what
, hi
賦值語句
從,
what[0] = &hi; /* Type of what[0] is pointer-to-char; Type of &hi is pointer-to-pointer-to-char */ what[1] = &wh; /* Type of what[1] is pointer-to-char; Type of &wh is pointer-to-pointer-to-char */ ... hi = &what[1]; /* Type of hi is pointer-to-char; Type of &what[1] is pointer-to-pointer-to-char */
至 ,
what[0] = hi; /* Types are same */ what[1] = wh; /* Types are same */ ... hi = what[1]; /* Types are same */
注:大小what
比真正需要的發布程序過高。 如果您有相同的程序,請在malloc
中將25
修改為2
。
char * hi;
char * wh;
char ** what;
int main(void) {
char z[4] = "wx\0";
char a[4] = "ab\0";
hi = &z;
wh = &a;
第一個錯誤; 表達式&z
和&a
類型均為char (*)[4]
(指向char
4元素數組的指針),而不是char *
。 要解決此問題,請同時刪除&
:
hi = z;
wh = a;
除非它是sizeof
或一元&
運算符的操作數,或者是用於初始化數組的字符串文字,否則類型“ N的T
元素數組”的表達式將被轉換(“ decay”)為鍵入“指向T
指針”,表達式的值就是數組中第一個元素的地址。
what = (char **) malloc( 25 * sizeof(char));
不要轉換malloc
的結果; 不必要1 ,並且根據編譯器版本,它可以抑制有用的診斷。 您也有類型不匹配。 您想為char
分配25個指針,但是您只分配了25個char
。 重寫為
what = malloc( sizeof *what * 25 );
類型表達的what
是char **
; 因此,表達式*what
是char *
。 所以sizeof *what
的結果與sizeof (char *)
結果相同。 上一行分配了足夠的內存來存儲25個指向char
指針,並將結果指針分配給what
。
what[0] = &hi;
what[1] = &wh;
同樣,刪除&
; hi
和wh
已經是char
指針:
what[0] = hi;
what[1] = wh;
printf("%s | %s\n", hi, wh);
hi = &what[1];
類型不匹配; &what[1]
類型為char **
, hi
類型為char *
。 同樣,刪除&
。
hi = what[1];
hi
和wh
現在指向同一事物( what[1]
== wh
和hi
== what[1]
,所以hi
== wh
;也就是說, hi
和wh
包含相同的指針值)。
printf("%s | %s\n", hi, wh);
return EXIT_SUCCESS;
}
malloc
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.