访问 C 结构数组

jwz*_*alt -2 c arrays segmentation-fault

我正在尝试学习访问结构数组。以下代码可以编译,但执行时出现段错误(核心转储)。我做错了什么?

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

// data structure
struct book {
  int     book_id;                     // book id
  int     (*ptFunc) ( struct book  );  // addr of printBook function
  char    title[50];                   // book title
  char    author[50];                  // book author
};

struct book aBooks[10];

/*************************************************************************
 *                                  main                                 *
 *************************************************************************/

void printBook ( struct book aBooks[], int id ) {
  printf ( "book_id       : %d\n", aBooks[id].book_id );  // access to struct
  printf ( "func addr     : %p\n", aBooks[id].ptFunc  );  // pointer to funcion
  printf ( "title         : %s\n", aBooks[id].title   );  // string
  printf ( "author        : %s\n", aBooks[id].author  );  // string
  printf ( "\n" );
}

int main (void) {

  strcpy ( aBooks[0].book_id,  0 );
  strcpy ( aBooks[0].ptFunc,  printBook );
  strcpy ( aBooks[0].title, "This Little Piggy" );
  strcpy ( aBooks[0].author, "Bad Wolf" );

  printBook (aBooks, 0 );                          // function to show selected data

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

解决方案: 复制并粘贴我明白了!(我有指向一个正在工作的函数的指针,然后添加了分配一个字符串并复制和粘贴太多!)在“chrslg”的帮助下,分配部分应该是:

  aBooks[0].book_id =  0 ;
  aBooks[0].prtFunc = printBook;
  strcpy ( aBooks[0].title, "This Little Piggy" );
  strcpy ( aBooks[0].author, "Bad Wolf" );
Run Code Online (Sandbox Code Playgroud)

[感谢您的帮助,我不知道“超级用户”和“Stack Overflow”之间有区别,我学到了一些东西!]

chr*_*slg 5

strcpy ( aBooks[0].book_id, 0 );

表示将地址 0 处的字符串复制到地址处的内存中aBooks[0].book_id(因此也是 0,因为 aBooks 是全局变量,因此初始化为 0)。

读写地址0会导致段错误。

无论如何,这不是一个字符串。

你的意思是aBooks[0].book_id=0

  • 他还需要更改“strcpy (aBooks[0].ptFunc, printBook);”,因为两个参数都不是字符串,并且两者具有不同的签名。 (2认同)
  • @MehdiCharife 但除了这个论点(只是一个随机数不能是一个合法的地址,可以通过你的代码访问,或者至少它的概率非常接近0),0还有一个特殊的原因。 C、0是一个特殊地址,被视为空指针。请参阅 PaulHankin 给出的链接 (2认同)