2014-12-13 149 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的回答,对这个问题最简单的补救措施是替换&&操作数的顺序。