【问题标题】:char* array initialization [closed]char *数组初始化[关闭]
【发布时间】:2012-10-15 16:40:31
【问题描述】:

我有这个数组:

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

【问题讨论】:

  • @NicholeGrace 不,不要那样做。至少这个问题并没有暗示代码是为了做到这一点。
  • 我看不出这个段错误。至少在这段代码中没有。必须有额外的代码,或者有段错误的代码看起来不同。
  • 我不喜欢for()的论据中的孤独j
  • 试过了。对我来说很好。请使用编译器发布完整的代码示例。
  • 代码中没有任何问题,可能提示存在段错误。也许,您在代码的其他部分执行了其他操作,导致段错误。你能发布一个你编译和运行的完整的sn-p吗?

标签: c char segmentation-fault


【解决方案1】:

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

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

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

【讨论】:

  • 谢谢。当我不使用 for 循环时,我仍然不明白代码看起来如何正确。
  • 这样的错误是非常随机的,具体取决于该指针的内存值是什么。因此导致的错误类型可能非常难以预测,甚至看起来没有任何错误。
【解决方案2】:

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

更新:叹息

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

错了。

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

【讨论】:

  • 终于唯一正确的答案了。尽管如此,如果这应该是一个评论而不是一个答案,仍然存在争议,即使它最终很受欢迎。
  • s引用的未初始化内存的任何赋值都是UB。
  • 这不是一个讨论网站,它是一个问答网站。 end of discussionsigh 等短语不属于答案。此外,s[len+1] = '\0'; 很好,因为在附加 c 后不会重新计算 len
  • 我不明白s[len+1] = '\0'; 行的问题。事实上,这与问题有关,因为 s 从未初始化。但在这种情况下,问题首先出现的确实是s[len] = c; 行。如果s 指的是一个足够大的缓冲区,那么这段代码将是完全有效的。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 我仍然想知道为什么我被@alk 否决了
    • 我的回答和他的类似:-/
    • 这是错误的。 s[len] 被分配了字符,因此新的终止符确实位于s[len+1]。问题与szo的初始化有关,否则append()函数完全有效。
    • strlen() 返回字符串中的字符数。例如,如果字符串中有 32(s[0]->s[31]) 个字符,则 s[32] 应该是 '\0' 字符而不是 s[33]。 djchelin 也对发布的其中一个版本感到困惑。
    • @PrototypeStart:不,你错了。 append() 函数附加到现有字符串。所以s[32] 得到附加的字符(替换旧的终止符),s[32+1] 得到新的 '\0' 终止符。那部分代码是正确的。如果您设置s[32] = '\0',那么您将覆盖您刚刚附加的字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-12
    • 2013-01-20
    • 1970-01-01
    • 2019-06-24
    • 2011-04-18
    • 2017-05-02
    • 2015-05-12
    相关资源
    最近更新 更多