[英]ANSI C: Declare a pointer of type “array of string”
我有這樣的結構
struct {
int id;
char str00[10];
char str01[10];
char str03[10];
char str04[10];
...
} myStructure;
所有strXX都具有相同的大小。 我想通過數組(strArray)訪問它們,如下所示:
strcpy(strArray[i], strValue);
如何聲明strArray?
我用過這個:
char (*strArray)[][10] = (void *)&myStructure.str00;
它工作正常,但我必須像這樣編寫strcpy
strcpy((*strArray)[i], strValue);
......我不喜歡這個:-)
還有另一種聲明strArray的方法嗎?
感謝您的想法和幫助。
你幾乎擁有它,正確的指針類型只是char (*ptr)[10]
。
天真地,您可以使用此指針類型來迭代結構成員,但這樣做會調用未定義的行為。 因為嚴格來說,指針只能指向單個項目或數組,如果我們使用指針算法超出單個項目/數組,我們會調用未定義的行為。
為了演示數組指針算法,我還會包含一個例子:
// BAD CODE, it relies on undefined behavior!
#include <stdio.h>
#include <string.h>
typedef struct {
int id;
char str00[10];
char str01[10];
char str02[10];
char str03[10];
} myStructure;
int main(void)
{
myStructure ms = { 0 };
char (*ptr)[10] = &ms.str00;
for(size_t i=0; i<4; i++)
{
strcpy(ptr[i], "hello ");
strcat(ptr[i], (char[]){i+'0', '\0'});
}
puts(ms.str00);
puts(ms.str01);
puts(ms.str02);
puts(ms.str03);
return 0;
}
正確的解決方案是使用聯合,以便您可以單獨或作為數組訪問成員:
typedef union {
struct // anonymous struct, requires a standard C compiler
{
char str00[10];
char str01[10];
char str02[10];
char str03[10];
};
char array[4][10];
} str_t;
typedef struct {
int id;
str_t str;
} myStructure;
strcpy(ms.str.array[i], ...); // access as array
puts(ms.str.str00); // access as individual item
以限定干凈的方式strArray
的要求將是使它的指針到在陣列(所述的第一個元件)的陣列myStructure
:
char *strArray[] = { myStructure.str00, myStructure.str01, myStructure.str03, myStructure.Str04, … };
使用此定義, strArray[i]
被初始化為結構的相應成員,例如myStructure.str01
。 請注意, myStructure.str01
將自動轉換為指向其第一個元素的指針,因此strArray[i]
是指向其中一個數組中第一個char
的指針。
然后strArray[i][j]
是數組i
char
j
。
(順便提一下,你在示例代碼中跳過str02
。我不知道為什么,但在上面的代碼中保留了它。)
另一種方法是使用union,可以通過各種方式完成,其中之一是:
struct
{
int id;
union
{
struct
{
char str00[10];
char str01[10];
char str03[10];
char str04[10];
...
};
char strArray[number of arrays][10];
};
} myStructure;
這通常是一個糟糕的設計,因為它不必要地混淆。 (雖然由於單獨定義的數組之間的填充而存在技術失敗的可能性,但可以使用斷言來確保不會發生這種情況,或者更確切地說是在何時進行檢測。)
通常,我們只是將字符串定義為數組數組:
struct
{
int id;
char str[number of arrays][10];
} my Structure;
然后,成員將始終通過索引引用,例如myStructure.str[1]
,而不是單個名稱,例如myStructure.str01
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.