[英]'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.