【问题标题】:Trouble Understanding C Basics难以理解 C 基础知识
【发布时间】:2016-05-22 21:01:11
【问题描述】:

我正在尝试进行 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)

【问题讨论】:

  • 添加一项重要内容:#include &lt;stdlib.h&gt;。请务必阅读printf 的文档。它适用于格式字符串,例如以这种方式打印数字:printf("Value: %d\n", val);。有一些格式可以修补字符串参数、单个字符、数字……
  • int size = sizeof(from)/sizeof(char); 不会像你想要的那样使用函数参数。第一个 sizeof 将给出指针的大小,这是函数唯一知道的关于 from 的信息。
  • 您对printf的使用完全错误,请RTM。
  • 而且sizeof(char) != 1是不可能的。
  • 错误消息会准确地告诉您您做错了什么。如果你想编程,一般来说,你需要结合阅读书籍和/或在线文档来解决问题并了解你所使用的语言。

标签: c arrays fault


【解决方案1】:

那里有很多错误,没有数组,只有结构。

  • 首先,您必须包含 stdlib 库 (#include &lt;stdlib.h&gt;)
  • 其次,printf函数不能这样使用。 此函数需要一个字符串来知道如何打印数据 ex:printf("an int: %d",myInt);printf("a string: %s",myString);。请注意 %d 或 %s,它们表示数据的放置位置。
  • 第三,我想你想要这个void assign_str(const char* from, char** to)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-07
    • 2013-12-15
    相关资源
    最近更新 更多