' C' 2d数组的分段错误

时间:2014-10-12 17:18:08

标签: c arrays codeblocks sigsegv

有人可以解释一下为什么这段代码不起作用吗?

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

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 < 1 || day > 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。分段错误。”

2 个答案:

答案 0 :(得分:4)

首先你需要一个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

哪个是对的,是啊!

答案 1 :(得分:1)

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

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

现在,您不能在代码中间植入{31, 28, ... }序列,并期望编译器将其解释为数组。该语言没有这样的功能,但它有一个类似的语法略有不同。唯一的方法是在#34;内联&#34;中实现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 }
};

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

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

P.S。在我的实验中,GCC根据我们的原始代码提供了一系列诊断消息。你从编译器那里收到了这些消息吗?你刚才忽略了它们吗?