-1

我有这个数组:

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;
}
4

4 回答 4

5

您的代码调用您的 append() 函数将数据附加到szo,但szo从未初始化并包含恰好在声明它的堆栈上的任何值。

谁知道它写到哪里。这几乎肯定是问题的原因。

szo通过将其指向足够大小的字符缓冲区来进行初始化。请记住使其大到足以容纳附加的数据和终止符。

于 2012-10-15T16:57:19.377 回答
3

分段错误很可能来自 line append(szo,c);,因为szo此时是一个未初始化的指针,您将它传递给一个函数,该函数试图使用该指针派生一个要写入的内存位置。

于 2012-10-15T16:58:56.003 回答
3

这意味着您的代码中的其他地方存在错误。您发布的代码中没有错误,讨论结束。

更新: 叹息

        s[len+1] = '\0';

是错的。

请在调试器中运行您的代码,以查看将来产生错误的行 - 因为它甚至不是您发布的代码中的一行。

于 2012-10-15T16:51:42.160 回答
1

它应该是 s[len] = '\0' 而不是 s[len+1] = '\0';。也正如其他用户所说, szo 从未初始化。它指向一个随机位置,该位置可能/可能不是可访问位置。导致分段违规

于 2012-10-15T16:57:27.253 回答