2014-10-08 6 views
0

Довольно простой вопрос C. Почему следующие две команды приводят к созданию строк, имеющих разные размеры?Основы C: сравнение «* char» и «char [x]» для создания строки

Как вы можете видеть ниже, метод 1 создает строку размером 8 байт, а метод 2 создает строку размером 5 байт.

Am запутался, почему метод 1 создает строку размером 8 байт ...

(я уже видел эти сообщения:. Difference of sizeof between char* x and char x[] и What is the difference between char s[] and char *s? Если у меня не было чтение-понимание обанкротиться, его на самом деле не решить, почему метод 1 создает строку размером 8 байт ... Согласно ответам, это, казалось бы, что метод 1 должен быть создание указателя размером 4 байта)

метод 1:.

char *string = "ABCD"; 

Способ 2:

char string2[5] = "ABCD"; 

Например, когда я запускаю следующую программу, я получаю вывод, показанный ниже.

#include <stdio.h> 

int main(int argc, char *argv[]) 
{ 
    char *string = "ABCD"; 

    printf("Based on \"char *string = \"ABCD\":\n"); 
    printf("Size of string: %ld\n",sizeof(string)); 
    printf("Size of each element of string: %ld\n",sizeof(string[0])); 
    printf("String: %s\n\n", string); 

    char string2[5] = "ABCD\0"; 

    printf("Based on \"char string2[5] = \"ABCD\":\n"); 
    printf("Size of string: %ld\n",sizeof(string2)); 
    printf("Size of each element of string: %ld\n",sizeof(string2[0])); 
    printf("String: %s\n\n", string2); 

    return 0; 
} 

Выход вышеуказанной программы:

enter image description here

+2

Возможный дубликат [В чем разница между char s \ [\] и char \ * s в C?] (http://stackoverflow.com/questions/1704407/what-is-the-difference-between-char-s-and-char-s-in-c) –

+0

еще один возможный обман: http://stackoverflow.com/questions/15538210/sizeof-a-pointer –

+0

Кроме того, для 'char string3 [] =" ABCDE ";' (не объявлен размер) 'sizeof (string3) == 6' (5 букв + нуль) –

ответ

1

это потому, что в этой строке char *string = "ABCD"; вы объявляете указатель на символ, который размером 8 байт, где, как и в этой строке char string2[5] = "ABCD"; вы объявляете массив из 5 символов, а так как char имеет длину 1 байт и 1 * 5 == 5 bytes, тогда размер string2 будет составлять 5 байтов

+0

Это может быть вопрос, но вы можете уточнить, почему указатель на char имеет размер, который в 8 раз больше, чем тип, на который он указывает (или 2x больше, если вы считаете четыре символа в ABCD, т. е. исключая/0)? (Я понимаю, почему 'char string2 [5] =" ABCD "результаты имеют размер 5 байтов.) – iceman

+1

, потому что указатель хранит адрес памяти, а не символы и адреса памяти, как правило, 8 байтов –

+0

Я понимаю сейчас, спасибо. Я думаю, что я был в замешательстве, потому что некоторые ответы в других потоках подразумевали, что указатели заняли всего 4 байта памяти, что действительно имеет место в 32-битном, но не для 64-битного (и я обзаведусь последним) , – iceman

0

Собака только ha s для хранения значения ASCII, которое представляет собой очень маленький диапазон чисел, поэтому они занимают только 1 байт каждый.

char * - указатель на адрес в памяти, который представляет собой гораздо больший диапазон чисел, поэтому для его хранения требуется больше байтов. Указатель на 32-битной системе занимает 4 байта, а в 64-битной системе - 8 байтов.

Я понимаю, что вы работаете на 64-битной системе? Я думаю, именно поэтому это 8 байт.

0

В первом примере вы объявляете переменную, являющуюся указателем на char. Итак, когда вы берете его размер с sizeof, вы получаете размер указателя (а не размер вещи, на который он указывает), что составляет 8 байтов на 64-битной платформе.

Во втором примере вы объявляете переменную, которая представляет собой массив из char. В C, sizeof массив делает так, как вы ожидали, - он возвращает размер массива в байтах, который в этом случае равен 5 * sizeof(char) (так как вы объявили массив из 5 символов), который равен 5 (с sizeof(char) = 1).

В любом случае, используя sizeof, как правило, это неправильный способ измерения длины строки - вместо этого вы должны использовать strlen. Это будет корректно обрабатывать случаи, когда символ конца строки NUL появляется где-то, кроме конца в конце массива char.

Смежные вопросы