我有这个数组:
char *tags[100];
如果我这样做:
tags[0]="something";
它有效(至少没有错误)。但是,for循环中的代码完全相同。
int j=0;
for(j; j<100; ++j)
{
tags[j]="something";
}
它说“分段错误”。这是什么?
更新:整个代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void append(char* s, char c)
{
int len = strlen(s);
s[len] = c;
s[len+1] = '\0';
}
int main()
{
int istag;
FILE *fopen(), *fp;
int i;
fp = fopen("oldal.html","r");
i= getc(fp) ;
char* szo;
int index=0;
char *tags[100];
int j=0;
for(j; j<100; ++j)
{
tags[j]="something";
}
while (i!= EOF)
{
i = getc(fp);
char c=i;
if(c=='<')
{
istag=1;
}
if(c=='>')
{
istag=0;
index++;
//printf("tag vege: %s %d",tags[index],index);
}
if(istag)
{
//append(tags[index],'a');
}
append(szo,c);
}
//printf("%s",szo);
fclose(fp);
return 0;
}
答案 0 :(得分:5)
您的代码调用append()函数将数据附加到szo
,但szo
从未初始化,并且包含在声明它的堆栈上发生的任何值。
谁知道它写在哪里。这几乎可以肯定是问题的原因。
通过将szo
指向足够大小的字符缓冲区来初始化{{1}}。请记住使其大到足以容纳附加的数据和终止符。
答案 1 :(得分:3)
这意味着您的代码中的其他位置存在错误。您发布的代码中没有错误,讨论结束。
更新:叹息
s[len+1] = '\0';
错了。
请在调试器中运行您的代码以查看将来错误产生的行 - 因为它甚至不是您发布的代码中的一行。
答案 2 :(得分:3)
分段错误很可能来自行append(szo,c);
,因为此时szo
是一个单位化指针,并且您将它传递给一个尝试使用指针来获取内存的函数写入的位置。
答案 3 :(得分:1)
它应该是s [len] ='\ 0'而不是s [len + 1] ='\ 0';。另外,如其他用户所说,szo从未初始化。它指向可能/可能不是可访问位置的随机位置。导致分段违规