2016-05-22 13 views
-3

私はCプログラミングに取り掛かりようとしていますが、C配列(この場合はCスタイルの文字列)へのデータの割り当てと引き出しに問題があります。問題を理解するCの基礎

ここに表示されている不具合をご指摘ください。

私は主にC++/Pythonプログラマーですので、メモリの使用方法や管理についてはできるだけ簡単にしてください。

#include <stdio.h> 

typedef struct AuthorInfo { 
    char* firstName; 
    char* lastName; 
} AuthorInfo; 

typedef struct BookEntry { 
    char bookID; 
    char* bookName; 
    AuthorInfo author; 
} BookEntry; 

void assign_str(const char** from, char** to) { 
    int size = sizeof(from)/sizeof(char); 
    printf((char)size); 
    printf('\n'); 
    for (int i=0; i < size; i++) { 
    (*to)[i] = (*from)[i]; 
    }; 
}; 

BookEntry BookEntry_(const int id, const char* bName, const char* aF, const char*aL, BookEntry* ret) { 
    ret->bookID = id; 
    ret->bookName = (char*)malloc(sizeof(bName)); 
    ret->author.firstName = (char*)malloc(sizeof(aF)); 
    ret->author.lastName = (char*)malloc(sizeof(aL)); 
    assign_str(bName, &ret->bookName); 
    assign_str(aF, &ret->author.firstName); 
    assign_str(aL, &ret->author.lastName); 
} 

void display_book(BookEntry* entry) { 
    printf(entry->bookName); 
    printf('\n'); 
    printf(entry->author.firstName); 
    printf(' '); 
    printf(entry->author.lastName); 
    printf('\n'); 
}; 

int main(int argc, char** args) { 
    BookEntry book; 
    book.bookID = 0; 
    assign_str("Tom Sawyer", &book.bookName); 
    assign_str("Mark", &book.author.firstName); 
    assign_str("Twain", &book.author.lastName); 
    display_book(&book); 
    return 0; 
}; 

gcc goof.c -o goof -std=c11結果とこのコードをコンパイル:

goof.c: In function ‘assign_str’: 
goof.c:16:10: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast [-Wint-conversion] 
    printf((char)size); 
     ^
In file included from goof.c:1:0: 
/usr/include/stdio.h:362:12: note: expected ‘const char * restrict’ but argument is of type ‘char’ 
extern int printf (const char *__restrict __format, ...); 
      ^
goof.c:16:3: warning: format not a string literal and no format arguments [-Wformat-security] 
    printf((char)size); 
^
goof.c:17:10: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast [-Wint-conversion] 
    printf('\n'); 
     ^
In file included from goof.c:1:0: 
/usr/include/stdio.h:362:12: note: expected ‘const char * restrict’ but argument is of type ‘int’ 
extern int printf (const char *__restrict __format, ...); 
      ^
goof.c:17:3: warning: format not a string literal and no format arguments [-Wformat-security] 
    printf('\n'); 
^
goof.c: In function ‘BookEntry_’: 
goof.c:25:26: warning: implicit declaration of function ‘malloc’ [-Wimplicit-function-declaration] 
    ret->bookName = (char*)malloc(sizeof(bName)); 
         ^
goof.c:25:26: warning: incompatible implicit declaration of built-in function ‘malloc’ 
goof.c:25:26: note: include ‘<stdlib.h>’ or provide a declaration of ‘malloc’ 
goof.c:28:14: warning: passing argument 1 of ‘assign_str’ from incompatible pointer type [-Wincompatible-pointer-types] 
    assign_str(bName, &ret->bookName); 
      ^
goof.c:14:6: note: expected ‘const char **’ but argument is of type ‘const char *’ 
void assign_str(const char** from, char** to) { 
    ^
goof.c:29:14: warning: passing argument 1 of ‘assign_str’ from incompatible pointer type [-Wincompatible-pointer-types] 
    assign_str(aF, &ret->author.firstName); 
      ^
goof.c:14:6: note: expected ‘const char **’ but argument is of type ‘const char *’ 
void assign_str(const char** from, char** to) { 
    ^
goof.c:30:14: warning: passing argument 1 of ‘assign_str’ from incompatible pointer type [-Wincompatible-pointer-types] 
    assign_str(aL, &ret->author.lastName); 
      ^
goof.c:14:6: note: expected ‘const char **’ but argument is of type ‘const char *’ 
void assign_str(const char** from, char** to) { 
    ^
goof.c: In function ‘display_book’: 
goof.c:34:3: warning: format not a string literal and no format arguments [-Wformat-security] 
    printf(entry->bookName); 
^
goof.c:35:10: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast [-Wint-conversion] 
    printf('\n'); 
     ^
In file included from goof.c:1:0: 
/usr/include/stdio.h:362:12: note: expected ‘const char * restrict’ but argument is of type ‘int’ 
extern int printf (const char *__restrict __format, ...); 
      ^
goof.c:35:3: warning: format not a string literal and no format arguments [-Wformat-security] 
    printf('\n'); 
^
goof.c:36:3: warning: format not a string literal and no format arguments [-Wformat-security] 
    printf(entry->author.firstName); 
^
goof.c:37:10: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast [-Wint-conversion] 
    printf(' '); 
     ^
In file included from goof.c:1:0: 
/usr/include/stdio.h:362:12: note: expected ‘const char * restrict’ but argument is of type ‘int’ 
extern int printf (const char *__restrict __format, ...); 
      ^
goof.c:37:3: warning: format not a string literal and no format arguments [-Wformat-security] 
    printf(' '); 
^
goof.c:38:3: warning: format not a string literal and no format arguments [-Wformat-security] 
    printf(entry->author.lastName); 
^
goof.c:39:10: warning: passing argument 1 of ‘printf’ makes pointer from integer without a cast [-Wint-conversion] 
    printf('\n'); 
     ^
In file included from goof.c:1:0: 
/usr/include/stdio.h:362:12: note: expected ‘const char * restrict’ but argument is of type ‘int’ 
extern int printf (const char *__restrict __format, ...); 
      ^
goof.c:39:3: warning: format not a string literal and no format arguments [-Wformat-security] 
    printf('\n'); 
^
goof.c: In function ‘main’: 
goof.c:45:14: warning: passing argument 1 of ‘assign_str’ from incompatible pointer type [-Wincompatible-pointer-types] 
    assign_str("Tom Sawyer", &book.bookName); 
      ^
goof.c:14:6: note: expected ‘const char **’ but argument is of type ‘char *’ 
void assign_str(const char** from, char** to) { 
    ^
goof.c:46:14: warning: passing argument 1 of ‘assign_str’ from incompatible pointer type [-Wincompatible-pointer-types] 
    assign_str("Mark", &book.author.firstName); 
      ^
goof.c:14:6: note: expected ‘const char **’ but argument is of type ‘char *’ 
void assign_str(const char** from, char** to) { 
    ^
goof.c:47:14: warning: passing argument 1 of ‘assign_str’ from incompatible pointer type [-Wincompatible-pointer-types] 
    assign_str("Twain", &book.author.lastName); 
      ^
goof.c:14:6: note: expected ‘const char **’ but argument is of type ‘char *’ 
void assign_str(const char** from, char** to) { 
    ^

そしてコードを実行するには、言うことはbashが発生します。

Segmentation fault (core dumped) 
+0

が一つの重要なinlcudeを追加したいと思います。 'printf'の文書を必ず読んでください。これはフォーマット文字列で動作します。このようにして、数値を出力します: 'printf(" Value:%d \ n "、val);'。文字列引数、単一の文字、数字にパッチを当てるフォーマットがあります。 –

+0

'int size = sizeof(from)/ sizeof(char);'は、関数の引数で望むようにしません。最初の 'sizeof'は、関数が' from'について知っている唯一のものであるポインタのサイズを与えます。 –

+5

あなたの 'printf'の使用は完全に間違っていますので、RTMしてください。 –

答えて

5

多かっでエラーなし配列、唯一の構造体があります。

  • まず、あなたは第二STDLIBライブラリ(#include <stdlib.h>
  • を含める必要があり、printf関数は、そのように使用することはできません。 この関数は、データex:printf("an int: %d",myInt);またはprintf("a string: %s",myString);の印刷方法を知るために文字列を必要とします。 %dまたは%sは、データの配置先を示します。 `の#include `:
  • は、第三に、私はあなたがこの​​