【问题标题】:Copy global array to another global array将全局数组复制到另一个全局数组
【发布时间】:2019-09-11 13:50:50
【问题描述】:

我有全局数组“SocietyName”,它是本地数组“SocietyNameFinal”的指针。然后将本地数组复制到 void 'CITY.stAREA1.pvSociety' 和 'CITY.stAREA2.pvSociety'。所以我可以使用两个不同的数组副本单独使用。一个空隙中的任何修改都不会影响另一个空隙。我该怎么做?

目前,当我在“SocietyInit”函数中首次输入时,stAREA1.pvSociety 的第一个元素为“TOM”。当函数 stAREA2.pvSociety 中的第二个条目的第一个元素为“JERRY”时,但我也注意到 stAREA1.pvSociety 的第一个元素也被修改为“JERRY”(因为我对两者都使用了相同的指针)。 我希望 stAREA2.pvSociety 的第一个元素为“TOM”,而 stAREA2.pvSociety 的第一个元素为“JERRY”。我怎样才能拥有它??

#include <stdio.h>
#include <stdlib.h> 
#include <string.h>

#define PERSON_NAME(sPersonName) { 0, 0, sPersonName }
#define SOCIETY_HEAD(sText)      { 0, 0, sText }

char PersonName[32] = {0};

typedef struct
{
    int SocietyNumber1;
    int SocietyNumber2;
    char const * const pszText;
} Text_st_t;

Text_st_t SocietyName[] =
{
    PERSON_NAME(PersonName),
    SOCIETY_HEAD("AMAR")        // Many other array members
};

typedef struct
{
    char szPersonName[15];
    void *pvSociety;
} AREA_st_t;

typedef struct
{
    AREA_st_t  stAREA1;
    AREA_st_t  stAREA2;
} CITY_st_t;

typedef struct
{
    CITY_st_t      CITY_stAREA;
} State_st_t;

State_st_t* STATE, sample;

#define CITY    STATE->CITY_stAREA

void SocietyInit(AREA_st_t *AREA);

int main()
{
    STATE = &sample;

    strcpy(PersonName,                  "DONAND");
    strcpy(CITY.stAREA1.szPersonName,   "TOM");
    strcpy(CITY.stAREA2.szPersonName,   "JERRY");

    SocietyInit(&(CITY.stAREA1));
    SocietyInit(&(CITY.stAREA2));

    // Here I want to First member of structe. I had tried as below but not ok. How can i do it???
    printf("stAREA1.pvSociety.szPersonName = %s\n", *((Text_st_t *)CITY.stAREA1.pvSociety));    // Here I want 'TOM'
    printf("stAREA2.pvSociety.szPersonName = %s\n", *((Text_st_t *)CITY.stAREA2.pvSociety));    // Here I want 'JERRY'

    printf("Finished");

    return 0;
}

void SocietyInit(AREA_st_t *AREA)
{
    Text_st_t *SocietyNameFinal = malloc(sizeof(SocietyName));

    (void)memcpy(SocietyNameFinal, SocietyName, sizeof(SocietyName));

    printf("===========================================\n");

    printf("SocietyName[0].pszText      = %s\n", SocietyName[0].pszText);
    printf("SocietyNameFinal[0].pszText = %s\n", SocietyNameFinal[0].pszText); 
    printf("CITY.stAREA1.szPersonName   = %s\n", CITY.stAREA1.szPersonName);
    printf("CITY.stAREA2.szPersonName   = %s\n", CITY.stAREA2.szPersonName);

    printf("-------------------------------\n");    
    strcpy((char *)SocietyNameFinal[0].pszText, AREA->szPersonName);

    printf("SocietyName[0].pszText      = %s\n", SocietyName[0].pszText);
    printf("SocietyNameFinal[0].pszText = %s\n", SocietyNameFinal[0].pszText); 
    printf("CITY.stAREA1.szPersonName   = %s\n", CITY.stAREA1.szPersonName);
    printf("CITY.stAREA2.szPersonName   = %s\n", CITY.stAREA2.szPersonName);

    printf("===========================================\n");
    AREA->pvSociety = (Text_st_t *)SocietyNameFinal;    // Copy local array to another global array

    return;
}

【问题讨论】:

  • 它们共享相同的字符串。要么在结构中声明一个 char 数组,要么将 每个 字符串复制到一个新分配的 char 数组(可能是 strdup)。

标签: c arrays string pointers structure


【解决方案1】:

有三种复制表格的方法。

  1. 迭代和复制
  2. memcpy
  3. 包装成一个结构并赋值

    struct {
        int x[16];
    }x,y;
    
    
    void foo(void)
    {
         y=x;
    }
    

最后一种方法通常对小数组最有效(对于较大的数组,通常调用 memcpy)

https://godbolt.org/z/rO6-of

【讨论】:

  • 我有更大的数组,所以如果你看到我的代码,我已经使用了 memcpy 函数。 memcpy 使用指针,所以当我在函数的第二个条目中修改我的数组时,它也会修改我以前的副本。我想要两个条目的单独副本,这不会影响彼此的任何修改
猜你喜欢
  • 1970-01-01
  • 2012-10-04
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-10
  • 2022-01-13
  • 1970-01-01
相关资源
最近更新 更多