簡體   English   中英

二維陣列的“ C”分割錯誤

[英]'C' Segmentation fault with 2d array

誰能解釋這個代碼為什么不起作用?

#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。分段錯誤。”

首先,您需要一個二維字符數組, 而不是一個指向字符的指針數組。

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

沒錯,是的!

如果我正確理解了您的意圖,則希望將嵌套的{31, 28, ... }序列用作char[]數組,上​​層數組中的指針將指向這些數組。

盡管有其他答案,但不能肯定地說您確實需要一個2D數組(即使在這種情況下2D數組可能比您嘗試做的更好)。 只要使用正確的語法,您的原始嘗試也將起作用。

現在,您不能只在代碼中間植入{31, 28, ... }序列,並期望編譯器將其解釋為數組。 該語言沒有這種功能,但是具有相似的語法,但語法略有不同。 以“內聯”方式實現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?),則僅是由於某些編譯器擴展。 在這種特殊情況下,該編譯器擴展碰巧對您造成了殘酷的笑話。 我什至不知道編譯器如何解釋它,但是絕對不知道您打算如何解釋它。

PS在我的實驗中,GCC響應了我們的原始代碼,給出了一堆診斷消息。 您是否從編譯器獲得了這些消息? 您只是忽略了他們嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM