Строки и указатели - PullRequest
       1

Строки и указатели

4 голосов
/ 04 июля 2011
#include<string.h>
#include<stdio.h>

int main()
{        
    char *p;         
    strcpy(p,"hello world");
}

Ну, это показывает undefined behaviour или это указывает на привет мир? Я видел многих программистов, использующих этот вид синтаксиса. Я знаю, что это лучше, чем массив, где вы не знаете размер строки. Но хорошо ли это использовать в программировании. Кто-нибудь может это объяснить?

Ответы [ 6 ]

4 голосов
/ 04 июля 2011

Это неопределенное поведение, так как p не инициализирован.Я не думаю, что вы действительно видите, что многие люди делают это ...

strcopy ожидает буфер достаточной длины для копирования содержимого второго аргумента.Ваш пример намеренно придуман, но в реальном коде вам нужно знать размер source_string, чтобы выделить буфер.

2 голосов
/ 04 июля 2011

Вы не инициализировали p, поэтому поведение явно не определено. Если вы инициализируете p, чтобы указать на область с достаточным пространством для хранения строки, или вы назначаете (не strcpy()) "hello world" на p (таким образом, указывая его на область в инициализированной памяти программы, где находится буквенная строка или вы используете strdup() вместо strcpy(), это будет работать.

1 голос
/ 04 июля 2011

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

char p[] = "Hello world!";

И он даже вычислит правильный размер для массива!

1 голос
/ 04 июля 2011

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

Вы, скорее всего, увидите код, подобный следующему.

int main()
{
    char *p = (char*)malloc(20);
    strcpy(p, "hello world");
    free(p);
}
1 голос
/ 04 июля 2011

Я видел много программистов, использующих этот вид синтаксиса.

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

0 голосов
/ 04 июля 2011

p неинициализирован, и копирование чего-либо в него приведет к Segmentation Fault и непредсказуемым результатам, поскольку местоположение в памяти, на которое указывает p, не указано кодом.

Прежде чем вы сможете скопировать строку в p, вы должны указать память, на которую указывает p.

Вы должны использовать char [Buffersize];
например char [12];

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