由strcpy()引起的分段错误

时间:2014-08-25 14:43:53

标签: c

为什么我在strcpy()中遇到分段错误?

程序编译没有任何问题但是 我因为strcpy而遇到分段错误,请给我一个出路。

struct obj
{
    char objcode[100];
}o[10];

int main()
{
    char buffer[500],statement[50][50];/*storing each statement*/
    int i=0,fd;
    int j=0,k=0;
    char *tok;
    fd=open("objectprogram.txt",O_RDONLY);
    const ssize_t r=read(fd,buffer,500);
    buffer[r]='\0';
    char *sta;
    sta=strtok(buffer,"\n");
    while(sta!=NULL)
    {
        strcpy(statement[i],sta);
        i++;
        sta=strtok(NULL,"\n");
    }   
    for(j=1;j<i-1;j++)
    {
        tok=strtok(statement[j],"^");
        tok=strtok(NULL,"^"); 
        tok=strtok(NULL,"^");
        while(tok!=NULL)
        {
            tok=strtok(NULL,"^");
            strcpy(o[k].objcode,tok);
        }

    }
}

3 个答案:

答案 0 :(得分:2)

tok==NULL循环中对while的{​​{1}}检查是在之后发送,而不是之前。您正在尝试复制NULL指针。

每当你遇到分段错误时,首先要寻找的是NULL指针的可能性。

答案 1 :(得分:2)

在此代码中:

                    while(tok!=NULL)
                    {
                        tok=strtok(NULL,"^");
                        strcpy(o[k].objcode,tok);
                    }

您在进入循环之前检查tok的有效性,但在strtok()更改之后没有。

调试器应该能够确切地确定哪个代码行存在问题,并且在调试器中,您可以看到tok的值是否正常strcpy()调用。

答案 2 :(得分:0)

strcpy在数组大小方面不安全,请改用strncpy !!

即。如果您在输入中获得更多数据,则会溢出您的声明[i]。