C: переменные локального указателя меняются после проблемы с sscanf - PullRequest
0 голосов
/ 01 августа 2010

Я написал C-код, часть которого:

...
    P *head=NULL,*cur=NULL;
    char Name,tmp[255];
    int AT,ET;
    FILE *iF;

    if((iF=fopen(fileName,"r"))>0){
        fgets(tmp,255,iF);
        sscanf(tmp,"Interval:%d\n",&quantum);
        fgets(tmp,255,iF); //waste

        while(!feof(iF) &&  fgets(tmp,255,iF)){
            sscanf(tmp,"%20c %20d %20d",&Name,&AT,&ET);
...

После выполнения последней sscanf (последняя строка) значения * head & * cur меняются (они больше не равны NULL !!)
В чем проблема?

Спасибо

Ответы [ 2 ]

4 голосов
/ 01 августа 2010

У вас есть классическое переполнение буфера. Вы читаете 20 символов в один байт Name, а дополнительные символы записываются в пространство, занятое head и cur и далее, вероятно, попирая возвращаемую информацию, которая хранится в стеке. Если вы напечатали значения head и cur в шестнадцатеричном формате, вы, вероятно, обнаружите, что значения соответствуют данным, введенным в Name. Например, если вы ввели «AAAAAAAAAAAAAAAAAAAA» в Name, вы, скорее всего, обнаружите, что и head, и cur содержат 0x41414141, если вы работаете на 32-битном компьютере.

Вам нужно превратить Name в массив - и вы можете опустить '&', передав его в sscanf(). Возможно, вы ожидаете:

char Name, tmp[255];

чтобы объявить и Name, и tmp как массивы из 255 символов; это не то, как работает C, хотя. Декларация эквивалентна:

char Name;
char tmp[255];
0 голосов
/ 01 августа 2010

Проверьте документацию fopen ().А c-faq

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...