2010-10-25 37 views
0

假设我有以下代码:访问/修改字符串数组中的结构

typedef struct 
{ 
    char **p; 
} STRUCT; 

int main() 
{ 
    STRUCT s; 
    *(s.p) = "hello"; 
    printf("%s\n", *(s.p)); 

    return 0; 
} 

这显然是行不通的,但它应该表现出什么,我想做的事情。我将如何去初始化,访问,打印等结构中的字符串数组?

回答

3

你有两个*你想要一个,我想。尝试:

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; 
} 

这第二个程序只为一个字符串指针分配空间;如果你想要一个数组,只需分配适当的空间量。

2

目前没有数组,但我认为你想创建一个。你需要,只要你想字符串首先分配尽可能多的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; 
} 
+0

嗯但可以在指针不被视为一个阵列中呢?即。 'char ** p',第一个指针指向一个字符串,第二个指向字符串中的字符。 – jon2512chua 2010-10-25 17:24:50

+0

@ jon2512chua:一个数组可以被认为是一个指针,而不是相反的方向。除非为它分配空间或使其指向现有变量/数组,否则不能使用指针存储任何内容。 – casablanca 2010-10-25 17:47:06

+0

好的,谢谢。 – jon2512chua 2010-10-25 18:51:12

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_stringslength_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);