C Почему передача первого адреса массива в указатель на символ дает целую строку? - PullRequest
0 голосов
/ 15 декабря 2018

Я сейчас играю с передачей массива char к указателю char.Множество примеров, которые я вижу, показывают, как вам нужно выделить память, которую будет использовать указатель строки перед копированием в него массива char.А при копировании вы перебираете массив для сохранения каждого адреса в выделенном указателе символа.

В приведенном ниже примере я не инициализирую указатель символа и не выполняю итерацию по массиву.Я просто передаю указатель на первый элемент.

int main()
{
    char c[10] = "something";
    // char* new_c = (char *)malloc(strlen(c)+1);
    char *new_c = NULL;
    new_c = c;
    printf("%s", new_c);

    return 0;
}

Почему new_c все еще печатает всю строку?Почему люди даже пытаются перебирать весь массив для копирования?

Ответы [ 3 ]

0 голосов
/ 15 декабря 2018

Запустите эту программу, и вы получите четкое представление о том, что происходит

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

int main(void) {
    char c[10] = "something";
    char *new_c = NULL;
    char new_c_2[10] = "";

    new_c = c; // copies address of 'c' to 'new_c' 


    for(int i=0; c[i]!='\0'; i++) {
        new_c_2[i] = c[i]; // copies value of 'c' to 'new_c_2'
    }

    // Data before changing the value of 'c'
    printf("\nData before changing the value of \'c\'\n");
    printf("new_c = %s\n", new_c);
    printf("new_c_2 = %s\n", new_c_2);

    strcpy(c, "changed");

    // Data after changing the value of 'c'
    printf("\nData after changing the value of \'c\'\n");
    printf("new_c = %s\n", new_c);
    printf("new_c_2 = %s\n", new_c_2);

    return 0;
}

ВЫХОД:

Data before changing the value of 'c'
new_c = something
new_c_2 = something

Data after changing the value of 'c'
new_c = changed
new_c_2 = something

char * new_c = NULL;new_c = c;

Эти операторы просто указывают 'new_c' на адрес 'c'.Таким образом, если вы измените значение «c» и используете «new_c», он перейдет по адресу «c» и выдаст обновленное значение.

Мы скопируем строку в другую, чтобы мы могли использоватьстарое значение, даже если мы изменим значение 'c'.

Пожалуйста, обратитесь к вызову по значению и вызову по ссылке в программировании на C для получения дополнительной информации.

0 голосов
/ 15 декабря 2018

Вы говорите: «Я не инициализирую указатель на символ».Вы делаете с

new_c = c;

Массив c распадается на указатель, как если бы вы передали c непосредственно в printf.И тогда это printf, который перебирает массив, пока не будет найден нулевой терминатор.

0 голосов
/ 15 декабря 2018

Почему люди даже пытаются перебирать весь массив для копирования?

ну, может быть, чтобы убедиться, что исходная ссылка не удаляется / перезаписывается через некоторое время.

Например, если исходный буфер является локальной / автоматической переменной, которая будет недействительной после возврата из функции.

Или, если я просто сделаю c[0] = '\0';.new_c сейчас ничего не отображает, потому что я только что убил единственную копию строки.

И копирование, и ссылка на другую строку с помощью "мелкого" указателя полезны, в зависимости от вариантов использования.

...