char* w union

0

Hej!
mam taki mały problem. Muszę umieścić kilka char* jako napisy w strukturze, która znajduje się w union. Pewnie niezbyt logicznie to napiałem więc na przykładzie:

 
union _Test
{
    char dlugosc_napisu[30];
    struct _Snapis
    {
        char* cos1;
        char* cos2;
    }Snapis;
};


int main()
{
union _Test test;
test.Snapis.cos1 = "Mythos";
test.Snapis.cos2 = "dobre piwo";
printf("%s\n\r", test.Snapis.cos1);
printf("%s\n\r", test.Snapis.cos2);
printf("%s\n\r", test.dlugosc_napisu);
return 0;
}

Po kompilacji otrzymuje wypisany na ekranie:

 
Mythos
dobre piwo
dP@

Przy odwołaniu się do dlugosc_napisu, nie powinienem miec dostępu do całego napisu "Mythos dobre piwo"?

1
snout napisał(a):

Przy odwołaniu się do dlugosc_napisu, nie powinienem miec dostępu do całego napisu "Mythos dobre piwo"?

Nie.
Powinieneś otrzymać dwa binarne adresy (czyli 2 razy 4 znaki dla 32-bitowych, razy 8 znaków dla 64-bitowych) plus ewentualne śmiecie ze stosu
w interpretacji znakowej. Co właściwie i otrzymujesz.
Union "skleja" dane na poziomie binarnym.
Może chciałeś zrobić to:
http://ideone.com/FgQ4YD

1
    char dlugosc_napisu[30];

To jest tablica 30 znaków (mogąca pomieścić 29 znaków tekstu i końcowy znak '\0'). Tablica, nie wskaźnik, czyli bajty napisu są tu, w tym miejscu.

        char* cos1;
        char* cos2;

To są dwa wskaźniki na char (na pojedyncze znaki albo na tablice, tego właściwie nie wiadomo, choć wskaźnik na pojedynczy znak ma mało sensu). Wskaźniki, nie tablice, czyli właściwe napisy nie są w tym miejscu, tylko gdzie indziej w pamięci.

0

_13th_Dragon myślałem nad użyciem po prostu tablicy char, ale nie mogę skorzystać z funkcji strncp(). Kod pisany jest na mikrokontroler, nie mogę użyć biblioteki string, przez brak pamięci flash.

Czyli wynikałoby z tego że pod dlugosc_napisu[0] powinien znajdować sie adres (dla rdzenia 8bitowego) pierwszego napisu, a pod dlugosc_napisu[1] adres drugiego napis. Zgadza się?

1
#include <cstdio>
#include <cstring>

union _Test
{
    char napis[30];
    struct
    {
        char cos1[15];
        char cos2[15];
    } Snapis;
};
 
 
int main()
{
  const char t1[] = "Mythos";
  const char t2[] = "dobre piwo";
  
  union _Test test;
  memset(test.napis, ' ', sizeof(test.napis));
  memcpy(test.Snapis.cos1, t1, sizeof(t1));
  memcpy(test.Snapis.cos2, t2, sizeof(t2));
  
  printf("%s\n", test.Snapis.cos1);
  printf("%s\n", test.Snapis.cos2);
  fwrite(test.napis, sizeof(test.napis), 1, stdout);
  printf("\n");
  return 0;
}
 
1
#include <stdio.h>

char *strcat(char *dst,const char *src)
  {
   char *ret=dst;
   while((*(dst++)=*(src++))!='\0') {}
   return ret;
  }

int main()
  {
   char buff_strcat[100]={0};
   char buff_sprintf[100];
   char a[]="Mythos";
   char b[]="dobre piwo";
   strcat(strcat(strcat(buff_strcat,a)," "),b);
   printf("%s\r\n",buff_strcat); // \n wystarczy ale jeżeli już to \r\n
   sprintf(buff_sprintf,"%s %s",a,b);
   printf("%s\r\n",buff_sprintf); // \n wystarczy ale jeżeli już to \r\n
   return 0;
  }
1

Czyli wynikałoby z tego że pod dlugosc_napisu[0] powinien znajdować sie adres (dla rdzenia 8bitowego) pierwszego napisu, a pod dlugosc_napisu[1] adres drugiego napis. Zgadza się?

Nie, bo char ma (z definicji) jeden bajt, a wskaźnik zajmuje dwa, cztery, osiem... zależnie od platformy.

0

Wielkie dzięki za odpowiedzi. Problemem nie jest kopiowanie danych pomiędzy dwiema tablicami. Jestem ciekaw czy jest jakiś sposób żeby użyć wskaźników, a nie tablic. W kodzie do uC korzystam z samych struktur. Po prostu, podczas pisania kodu zaciekawiło mnie jak by to wyglądało z użyciem union.

0

a potrzebujesz do tego w ogóle union?

#include <cstdio>
#include <cstring>

int main()
{
  const char t1[] = "Mythos";
  const char t2[] = "dobre piwo";

  char t[30];
  char* p1 = t;
  char* p2 = t + 15;
  
  memset(t, ' ', sizeof(t));
  memcpy(p1, t1, sizeof(t1));
  memcpy(p2, t2, sizeof(t2));
 
  printf("%s\n", p1);
  printf("%s\n", p2);
  fwrite(t, sizeof(t), 1, stdout);
  printf("\n");
  
  return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1