приведение буфера char к структуре c - PullRequest
0 голосов
/ 01 апреля 2012

В приведенном ниже коде я ожидал другого выхода!:

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

typedef struct _cust {
        char    customerId[10];
        char    customerPhone[10];
        char    customerDep[4];
} cust;

int main(int argc, char **argv) {
        cust    *newCust;
        const char testChar[] = "11W35A5CT-012345678-CORP";

        newCust = (cust *)malloc(sizeof(struct _cust));
        newCust = (cust *)testChar;

        printf("CustomerId = %s\n", newCust->customerId);
        printf("CustomerPhone = %s\n", newCust->customerPhone);
        printf("CustomerDep = %s\n", newCust->customerDep);

        return 0;
}

И вывод:

CustomerId = 11W35A5CT-012345678-CORP
CustomerPhone = 012345678-CORP
CustomerDep = CORP

Я ожидал этого вывода:

CustomerId = 11W35A5CT-
CustomerPhone = 012345678-
CustomerDep = CORP

Может кто-нибудь объяснить мне, почему это?Спасибо.

РЕДАКТИРОВАТЬ:

Чтобы не запутаться в моем посте, я добавляю сюда трассировку GDB при отладке этой программы:

(gdb) b main
Breakpoint 1 at 0x8048474: file name.c, line 11.
(gdb) run
Starting program: /home/evariste/src/customer_files/a.out 

Breakpoint 1, main (argc=1, argv=0xbffff2c4) at name.c:11
11  int main(int argc, char **argv) {
(gdb) n
13      const char testChar[] = "11W35A5CT-012345678-CORP";
(gdb) n
15      newCust = (cust *)malloc(sizeof(struct _cust));
(gdb) n
16      newCust = (cust *)testChar;
(gdb) n
21      printf("CustomerId = %s\n", newCust->customerId);
(gdb) print *newCust
$1 = {customerId = "11W35A5CT-", customerPhone = "012345678-", 
  customerDep = "CORP"}

Так что здесь, я вижу, чтоcustomerId = "11W35A5CT-", и когда я пробую printf, я получил всю строку?

Ответы [ 3 ]

6 голосов
/ 01 апреля 2012

printf() будет выводиться до тех пор, пока не достигнет значения \0, которое сигнализирует о конце строки. Там нет \0 после любого из дефисов, и поэтому printf() будет печатать из начальной позиции, которую вы задали, до конца того, что находится в testChar.

Также вы вытекли из памяти выделенного для вас вызова на malloc. Возможно, вы хотите скопировать строку в структуру?

2 голосов
/ 01 апреля 2012

Это немного упрощение, но, надеюсь, оно проиллюстрирует, что происходит.

typedef struct _cust {
        char    customerId[10];
        char    customerPhone[10];
        char    customerDep[4];
} cust;

То, что с этим сделает компилятор, притворится, что это 24-символьный блоб.Предположим, что blob коренится в символе *, который называется x.Тогда customerId - это просто псевдоним для x + 0, customerPhone - это псевдоним для x + 10, а customerDep - псевдоним для x + 20.

Итак, что происходит, когда вы перезаписываете указатель со строкой, так этоx = testChar.

Это означает, что customerId - это & ​​testChar [0], customerPhone - это & ​​testChar [10] и т. д.

Проблема в том, что printf и друзья, как сказал QuantumMechanic, делаютне иметь понятия диапазона для строки.Строка AC только начинается до нулевого байта.Это означает, что printf () в customId будет идти от testChar [0] до тех пор, пока он не достигнет нулевого байта, который будет концом строки testchar.

Чтобы сделать то, что вы хотите, каждая строка должна иметьв конце вставлен нулевой байт, означающий, что ваше наложение не будет работать (также я считаю, что ваше наложение может привести к неопределенному поведению, но я не уверен).

(или вы можете сделать какпредложил мтекерт.)

0 голосов
/ 01 апреля 2012

Откажитесь от malloc, укажите размер строки для печати в спецификаторе формата printf.

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

typedef struct _cust {
    char    customerId[10];
    char    customerPhone[10];
    char    customerDep[4];
} cust;

int main(int argc, char **argv) {
    cust    *newCust;
    const char testChar[] = "11W35A5CT-012345678-CORP";

    newCust = (cust *)testChar;

    printf("CustomerId = %.*s\n", 
        sizeof(newCust->customerId), newCust->customerId);
    printf("CustomerPhone = %.*s\n", 
        sizeof(newCust->customerPhone), newCust->customerPhone);
    printf("CustomerDep = %.*s\n", 
        sizeof(newCust->customerDep),newCust->customerDep);

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...