Массив Арифметическая проблема в C - PullRequest
0 голосов
/ 29 марта 2011

У меня есть код C в длинном файле, который скомпилирован с помощью cc.Но когда я пытался скомпилировать на GCC, это дает ошибку.Я взял этот конкретный код в небольшой программе и попытался скомпилировать на cc, но там он не получился.

Вот источник:

#include <stdio.h>
int main (int argc, char **argv)
{
     char unsigned   FileName[100];
     char            test[100];
     FileName[strstr(FileName,test) - FileName] = 0;   
     return 0;
}

Эта строка вызывает проблему: FileName[strstr(FileName,test) - FileName] = 0;

ошибка на CC:

"foo.c", line 10: operands have incompatible types:
         int "-" pointer to unsigned char

и на gcc:

foo.c:10: error: invalid operands to binary - Both are same.

Но когда я компилирую оригинальный файл на CC, он компилируется и просто выдает предупреждение.Например:

"dbtprc.c", line 643: warning: argument #1 is incompatible with prototype:
        prototype: pointer to const char : "/usr/include/iso/string_iso.h", line 133
        argument : pointer to unsigned char
"dbtprc.c", line 643: warning: improper pointer subtraction

Не могли бы вы помочь, почему здесь выдается предупреждение «неправильное вычитание указателя», а в примере программы показывается ошибка?

Ответы [ 4 ]

1 голос
/ 29 марта 2011

Есть ли что-нибудь, называемое Array Arithmetic в C? Читать это:

Массивы не являются указателями .

И посмотрите, как использовать strstr () .

1 голос
/ 29 марта 2011

Вы не пропустили включение <string.h> ??

Если да, то угадали прототип strsrt и по умолчанию он возвращает int, отсюда и недопустимая операция указателя.

В противном случае оказывается, что несоответствие подписи является причиной предупреждения / ошибки.Используйте (char*) сотворение перед двумя вхождениями вашего стола, и оно пойдет.

1 голос
/ 29 марта 2011
void * bar;
void * foo;
...
foo = bar + 1;

Это неопределенное поведение, прямо здесь!Вы ссылаетесь на область памяти, которая даже не была выделена.

РЕДАКТИРОВАТЬ :

Теперь у вас есть другая проблема: даже если вы успешно объявили оба массива, вы потерпели неудачуочистить / инициализировать их.Только Бог знает, что strstr() вернет вам.

Проблема, с которой вы скомпилировали этот код, состоит в том, что strstr () принимает 2 const char*, и вы определили Имя файла как беззнаковое: char unsigned FileName[100];

char * strstr (const char * стог сена, const char * игла);

0 голосов
/ 29 марта 2011

Ошибка или предупреждение мало чем отличаются, они просто показывают, насколько серьезный компилятор считает проблему.

Но почему вы используете unsigned char для имени файла? Это противоречит strstr, который обрабатывает только char* как для параметра, так и для типа возвращаемого значения.

Это то, что компиляторы пытаются вам сказать по-разному.

...