2014-12-13 186 views
1

我的程序編譯時出現任何錯誤,但它不起作用(分段錯誤)。什麼是錯誤?函數修改外部變量

A.H

extern int k; 
extern int j; 
char funk(char *str[], int i); 

變交流

#include "a.h" 

int k=0; 
int j=0; 
char funk(char *str[], int i) { 
    if (str[k][j] == '\0' && k < i) { 
     k++; 
     j = 0; 
    } 

    return str[k][j++]; 
} 

b.c

#include <stdio.h> 
#include "a.h" 
int main(int argc, char *argv[]) 
{ 
    char c; 
    while (c = funk(argv, argc)) 
     printf("%c", c); 

    return 0; 
} 
+3

請不要告訴我:'a.h','a.c'和'b.c'是你的文件名?你是否也在通過stackoverflow的方式失去了你的'main()'函數? – Rizier123 2014-12-13 16:26:22

+0

'k usr2564301 2014-12-13 16:31:08

+0

嗨@hrlinc,如果有任何答案已解決您的問題,請考慮通過點擊複選標記來接受它。這向更廣泛的社區表明,您已經找到了解決方案,併爲答覆者和您自己提供了一些聲譽。 – 2501 2014-12-27 14:28:02

回答

1

您正在閱讀的出界。在循環中調用func()可確保您最終會讀出界限,這時k==i在此處:str[k][j] == '\0'

首先執行檢查k < i

+0

謝謝,但不工作!當我在funk程序作品中刪除j = 0時。但它只是打印argv [0]。 – hrlinc 2014-12-13 16:39:39

1

這是因爲argv[argc]保證爲空指針,您在上次迭代中解除引用。

從N1570(C11)5.1.2.2.1/2程序啓動

argv[argc]應是一個空指針。

至於@ 2501的回答,對這個問題最簡單的補救措施是替換&&操作數的順序。