假設我有以下代碼:訪問/修改字符串數組中的結構
typedef struct
{
char **p;
} STRUCT;
int main()
{
STRUCT s;
*(s.p) = "hello";
printf("%s\n", *(s.p));
return 0;
}
這顯然是行不通的,但它應該表現出什麼,我想做的事情。我將如何去初始化,訪問,打印等結構中的字符串數組?
假設我有以下代碼:訪問/修改字符串數組中的結構
typedef struct
{
char **p;
} STRUCT;
int main()
{
STRUCT s;
*(s.p) = "hello";
printf("%s\n", *(s.p));
return 0;
}
這顯然是行不通的,但它應該表現出什麼,我想做的事情。我將如何去初始化,訪問,打印等結構中的字符串數組?
你有兩個*
你想要一個,我想。嘗試:
typedef struct
{
char *p;
} STRUCT;
int main()
{
STRUCT s;
s.p = "hello";
printf("%s\n", s.p);
return 0;
}
如果做真的希望有雙間接,您需要分配爲你解引用指針的一些空間。原始程序中的*(s.p)
取消引用未初始化的指針。在這種情況下:
typedef struct
{
char **p;
} STRUCT;
int main()
{
STRUCT s;
s.p = malloc(sizeof(char *));
*(s.p) = "hello";
printf("%s\n", *(s.p));
free(s.p);
return 0;
}
這第二個程序只爲一個字符串指針分配空間;如果你想要一個數組,只需分配適當的空間量。
目前沒有數組,但我認爲你想創建一個。你需要,只要你想字符串首先分配儘可能多的char *
S:
int main()
{
STRUCT s;
int N = 10; // number of strings you want
s.p = (char **)malloc(N * sizeof(char *));
s.p[0] = "hello";
s.p[1] = "world";
...
printf("%s\n", s.p[0]);
free(s.p);
return 0;
}
你將需要了解有多少字符串數組中包含的,通過添加一個計數成員的結構或使用一個NULL哨兵值。下面的實施例使用NULL前哨:
分配和初始化:
STRUCT s;
s.p = malloc(sizeof *s.p * (number_of_strings + 1));
if (s.p)
{
size_t i;
for (i = 0; i < number_of_strings; i++)
{
s.p[i] = malloc(length_of_ith_string + 1);
if (s.p[i])
strcpy(s.p[i], ith_string);
}
s.p[i] = NULL;
}
爲number_of_strings
,length_of_ith_string
,和ith_string
適當的值。
訪問/打印:
for (i = 0; s.p[i] != NULL; i++)
printf("String %d: %s\n", i, s.p[i]);
取消分配:
for (i = 0; s.[i] != NULL; i++)
free(s.p[i]);
free(s.p);
嗯但可以在指針不被視爲一個陣列中呢?即。 'char ** p',第一個指針指向一個字符串,第二個指向字符串中的字符。 – jon2512chua 2010-10-25 17:24:50
@ jon2512chua:一個數組可以被認爲是一個指針,而不是相反的方向。除非爲它分配空間或使其指向現有變量/數組,否則不能使用指針存儲任何內容。 – casablanca 2010-10-25 17:47:06
好的,謝謝。 – jon2512chua 2010-10-25 18:51:12