无效读取大小为1的Strcpy

时间:2012-11-13 03:31:55

标签: c valgrind strcpy

我一直收到大小为1的无效读取的valgrind错误,我无法确定原因。

导致错误的原因是什么?

==24647== Invalid read of size 1
==24647==    at 0x40258EA: strcpy (mc_replace_strmem.c:437)
==24647==    by 0x8048606: main (source.c:26)
==24647==  Address 0x0 is not stack'd, malloc'd or (recently) free'd
==24647==
==24647==
==24647== Process terminating with default action of signal 11 (SIGSEGV)
==24647==  Access not within mapped region at address 0x0
==24647==    at 0x40258EA: strcpy (mc_replace_strmem.c:437)
==24647==    by 0x8048606: main (source.c:26)
==24647==  If you believe this happened as a result of a stack
==24647==  overflow in your program's main thread (unlikely but
==24647==  possible), you can try to increase the size of the
==24647==  main thread stack using the --main-stacksize= flag.
==24647==  The main thread stack size used in this run was 16777216.

以下是我的代码,我对检测到错误的行进行了评论(source.c:26)。

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <string.h>

int main()
{

    char input[100];

    char name[100];

    char age[100];

    int agee[100];

    fgets(input,sizeof(input),stdin); //i scan in the string and store int char array called input.

    char *charpoint;//declare pointer character

    charpoint=strtok(input,"\"");//run strtoken with quotation marks as second part of argument.

    strcpy(name,charpoint);

    char * charpoint2=strtok(NULL,"\",");

    strcpy(age,charpoint2); //This line is where the error occurs. line 26

    sscanf(age,"%d",&agee[0]);

    printf("%s %d",name, agee[0]);

    system("pause");

    return 0;

}

2 个答案:

答案 0 :(得分:7)

从手册页(强调我的):

  

strtok()和strtok_r()函数返回指向开头的指针   在替换令牌本身之后,字符串中的每个后续令牌       具有NUL字符。 当没有剩余令牌时,空指针就是       返回。

从您的错误中

==24647==  Address 0x0 is not stack'd, malloc'd or (recently) free'd

因此,您的指针charpoint2为NULL,这意味着您之前的strtok调用找不到您的预期。您应检查该可能性并打印有关输入格式的错误。当然,您应该验证您的strtok来电符合您的意图。

答案 1 :(得分:0)

关于你的计划的一些事情。

  1. 在使用之前清除所有数组,这将确保读入无垃圾。您可以使用memset或只输入char [100] = {0};
  2. 读入数据后,通过显式设置input [99] ='\ 0'确保输入为空终止。这是为了确保输入永远不会超过数组的大小
  3. 对strtok返回的指针进行空检查,无法保证得到您期望的结果。适当处理空值。我的预感是,charpoint2将为您返回null,从而导致错误。