проблемы с преобразованием const char * в char * в c - PullRequest
3 голосов
/ 04 марта 2012
int A(const char* name){     
    name = "Here you GO!";    
    char* new_name;      
    //strcpy(new_name,name);      
    new_name = const_cast<char *>(name);      
    printf("%s\n", new_name);      
    return 0;    
}

Это исходный код, который я тестирую.

одна проблема, когда я использую const_cast<char *>, он говорит, что он не объявлен. (Я знаю, что это может работать при компиляции 'g ++') Другая проблема заключается в том, что когда я пытаюсь использовать strcpy для их объединения, возникает ошибка сегментации. Исходя из этого я должен использовать gcc whatevername.c -std=c99 для компиляции.

Кто-нибудь предлагает какое-нибудь предложение, как решить это? Очень ценю ..

Ответы [ 4 ]

9 голосов
/ 04 марта 2012

Вы получаете ошибку сегментации, потому что new_name нигде не указывает.

Решение: выделить память для new_name. Вы можете либо вызвать malloc () и затем использовать strcpy (), либо вызвать strdup (), которая сделает за вас обе вещи:

int A(const char* name){ 
    name = "Here you GO!";

    char* new_name = strdup(name);

    printf("%s\n", new_name);
    return 0;
}

См. Этот ответ для более подробной информации о strdup (): /171915/strdup-chto-on-delaet-v-c

7 голосов
/ 04 марта 2012

Вам нужно выделить место для новой строки.Вы были на правильном пути, используя strcpy, потому что const_cast - это только C ++.Изменить: Еще лучше использовать strdup, как предлагает Мирослав.

int A(const char* name)
{ 
    name = "Here you GO!";
    char* new_name = malloc(strlen(name)+1);
    if (new_name) {
        strcpy(new_name,name);
        printf("%s\n", new_name);
    }
    return 0;
]
4 голосов
/ 04 марта 2012

const_cast - вещь C ++;он не существует в C.

Если вы хотите использовать strcpy, вы не можете просто использовать неинициализированный указатель (то есть new_name).Сначала вам нужно выделить достаточно места (malloc), а затем free, когда вы закончите.

1 голос
/ 04 марта 2012

Вы не выделили место для new_name. Выделите достаточно для хранения строки, в которую вы копируете.

...