‘C’分段故障与2darrays

谁能解释一下为什么这段代码不起作用?

#include  #include  void findAndPrint(char *arr[], int year, int month, int day); int main() { char *dayTab[] = { {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} }; findAndPrint(dayTab, 3, 3, 3); getchar(); return 0; } void findAndPrint(char *arr[], int year, int month, int day ){ int d = 0; if(month > 12 || month  31 || day<1) return; int leap = ((year%4==0 && year%100!=0) || year%400 == 0)?1:0; int i; for(i=0; i<month-1; i++){ d += arr[leap][i]; } d+= day; printf("Day = %d", d); } 

IDE(Code :: Blocks)写入“程序接收信号SIGSEGV。分段故障”。

首先,您需要一个2d字符数组, 而不是字符指针数组。

 char dayTab[][12] = { {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} }; 

然后,您必须更改函数以接受该类型。

 void findAndPrint(char arr[][12], int year, int month, int day ) ; 

其余的看起来不错。

尝试使用参数:

 findAndPrint(dayTab, 2014, 10, 12); 

给我们一天: 285

哪个是对的,yaaay!

如果我正确地理解了你的意图,你希望那些嵌套的{31, 28, ... }序列作为char[]数组,上​​层数组中的指针将指向这些数组。

尽管其他答案所述,但说你必然需要一个文字2D数组是不正确的(尽管在这种情况下,2D数组可能比你试图做的更好)。 只要您使用正确的语法,您的原始尝试也将起作用。

现在,您不能在代码中间生成{31, 28, ... }序列,并期望编译器将其解释为数组。 该语言没有这样的function,但它有一个类似的语法略有不同。 以“内联”方式实现char *dayTab[]数组正确初始化的唯一方法是使用复合文字特征。 初始化将如下所示

 char *dayTab[] = { (char []) { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, (char []) { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } }; 

注意extra (char [])语法。 这是绝对必要的。 这是您必须在原始代码中进行更改以使其按预期进行编译的唯一方法。

您原始代码中的当前内容无效C.如果某些编译器接受了此代码(CodeBlocks中的GCC?),那么仅由于某些编译器扩展。 在这种特殊情况下,编译器扩展恰好在你身上发挥了一个残酷的笑话。 我甚至不知道它是如何被编译器解释的,但绝对不是你想要如何解释它。

PS在我的实验中,GCC根据我们的原始代码提供了一系列诊断消息。 你从编译器那里收到了这些消息吗? 你有没有理睬他们?