2017-12-02 20 views
0

私はC文字列に拡張子を追加しようとしていますが、Signal:SIGABRT(Aborted)を取得するだけです。シグナル:SIGABRT(Aborted)@ realloc

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


#define OUT_OF_MEMORY 3 
#define FILE_EXTENSION ".txt" 

typedef enum _Bool_ // enum _Bool_ is a non-typedef'ed enum 
{ 
    FALSE = 0, // Enum element 
    TRUE = 1 // Enum element 
} Bool; // Bool is the typedef'ed enum 

Bool cStringEndsWith(const char *sourceString, const char *suffix) { 
    if (!sourceString || !suffix) // Check for not null pointer 
    { 
    return FALSE; 
    } 
    size_t length_of_c_string = strlen(sourceString); 
    size_t length_of_suffix = strlen(suffix); 
    if (length_of_suffix > length_of_c_string) { 
    return FALSE; 
    } 
    int compare_result = strncmp(sourceString + length_of_c_string - length_of_suffix, suffix, length_of_suffix); 
    if (compare_result == 0) { 
    return TRUE; 
    } else { 
    return FALSE; 
    } 
} 

int prepareFileName(char **ptr_file_name){ 
    int ends_with_file_extension = cStringEndsWith(*ptr_file_name, FILE_EXTENSION); 
    if(!ends_with_file_extension) 
    { 
    char *new_ptr_file_name = realloc(*ptr_file_name, strlen(*ptr_file_name) + strlen(FILE_EXTENSION) + 1); 
    if(!new_ptr_file_name) 
     return OUT_OF_MEMORY; 
    *ptr_file_name = new_ptr_file_name; 
    strcat(*ptr_file_name, FILE_EXTENSION); 
    } 
} 

int main() 
{ 
    char *file_name = "testFileName"; 
    printf("Filename unprepared: \"%s\"", file_name); 
    prepareFileName(&file_name); 
    printf("Filename prepared: \"%s\"", file_name); 
    return 0; 
} 
+0

'char * file_name'で読み取り専用メモリを変更しようとしていますか? –

+0

ああありがとうuser3121023、私の悪い、私はそのことを知らなかった – Pedro

答えて

3

file_nameは、テキストセグメントである(読み取り専用)あなたのプログラムの:これは私がこれまで行ってきた、エラーが機能「prepareFileName」にreallocを@に来るものです。ヒープ上にスペースを割り当てるには、malloc() + strcpy()を使用してください。

は、ptrがNULLでない限りman realloc

、それは のmalloc()、のcalloc()、またはreallocの()に以前の呼び出しで返されている必要があります参照してください。

+1

お返事ありがとうございます(私はそれを受け入れることができるまで8分を待たなければなりません) – Pedro

+0

問題はありません。あなたは 'asprintf(...、"%s。%s "、file_name、extension)'を使って、 – Kevin

関連する問題