стрток на 64 битных машинах - PullRequest
7 голосов
/ 21 февраля 2012

Следующий код работает по-разному на 64-битной и 32-битной системах, что вызывает проблемы с переносом кода.

char * tmp = "How are you?";
printf("size of char * = %ld and size of strtok return val = %ld \n",sizeof(char *),sizeof(strtok(tmp," ")));

Ниже приводится вывод:

32 bit: 
size of char * = 4 and size of strtok return val = 4 

64 bit:

size of char * = 8 and size of strtok return val = 4

Страница man strtok гласит:

   #include <string.h>

   char *strtok(char *str, const char *delim);

RETURN VALUE
       The strtok() and strtok_r() functions return a pointer to the next token, or NULL if there are no more tokens.

Символ * на 64-битной машине долженбыть 8 байтов, как напечатано.Так почему же strtok возвращает 4-байтовый указатель на 64-битную машину?

Спасибо

Ответы [ 2 ]

9 голосов
/ 21 февраля 2012

Вы забыли #include <string.h>.

Это приводит к тому, что компилятор выводит тип возвращаемого по умолчанию значения int. # Включая правильный заголовочный файл, правильный прототип помещается в область видимости.

Это решает проблему для меня на gcc. Если это не для вас, какой компилятор вы используете?

3 голосов
/ 21 февраля 2012

Вызов strtok(tmp, " ") приведет к неопределенному поведению, так как он попытается изменить строковый литерал, на который указывает tmp, но так как операнд sizeof не оценивается (с одним исключением, которое здесь не применяется), это не проблема.

Реальная проблема заключается в том, что вы пытаетесь напечатать size_t значения в формате "%ld", для которого требуется аргумент unsigned long.

Есливаша реализация поддерживает его, правильный формат для аргумента size_t: "%zu" (добавлен в C99):

printf("size of char * = %zu and size of strtok return val = %zu\n",
       sizeof(char *), sizeof(strtok(tmp," ")));

В противном случае явно преобразуйте аргументы в соответствующий размер.Я бы использовал "%lu", поскольку size_t - это тип без знака.

printf("size of char * = %lu and size of strtok return val = %lu\n",
       (unsigned long)sizeof(char *), (unsigned long)sizeof(strtok(tmp," ")));

Вот полная автономная программа, которая должна давать ожидаемые результаты при любой реализации C89 или более поздней версии:

#include <stdio.h>
#include <string.h>
int main(void) {
    char * tmp = "How are you?";
    printf("size of char * = %lu and size of strtok return val = %lu\n",
           (unsigned long)sizeof(char *),
           (unsigned long)sizeof(strtok(tmp," ")));
    return 0;
}

РЕДАКТИРОВАТЬ: Комментарий ОП к другому ответу указывает, что проблема была в заголовке string.h;очевидно, у него было

#include "string.h"

, а не

#include <string.h>

Я собираюсь оставить этот ответ здесь, потому что он описывает другую проблему, которая должна быть исправлена ​​в коде ОП, но нетот, который вызвал наблюдаемый симптом.и компилятор подобрал неправильный заголовочный файл string.h.

...