簡體   English   中英

ANSI C:聲明類型為“字符串數組”的指針

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM