Следующее использование strcat_s показывает "C4047: различается по уровням косвенности"

Что не так со следующими строками?

//Thanks to Mark
#include <string.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
char datfile[127];
if(argc < 2) return -1;
strcpy_s(datfile, strlen(argv[1]), argv[1]);
strcat_s(datfile, strlen(argv[1]) + 4, ".dat");
printf("%s\n",datfile);//the warning appears here (why?)
return 0;
}

Это показывает Warning C4047 'function': 'const char *' differs in levels of indirection from 'char'

Я просмотрел документацию, предоставленную MSDN для C4047, Называет термин под названием levels of indirection, Я прошел через некоторые обсуждения, связанные с этой темой i.e. levels of indirection в сети и (как новичок) я нашел те, которые выходят за рамки моего радара.

Я был бы очень рад, если бы кто-то указал на проблему с кодом выше и дал просто понятное объяснение термина level of indirection,

1 ответ

Поддающийся проверке пример исходной ошибки:

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

int main(int argc, char* argv[])
{
    char datfile[127];
    if(argc < 2)
        return -1;
    strcpy_s(datfile, strlen(argv[1]), argv[1]);
    strcat_s(datfile, strlen(argv[1]) + 4, '.dat');
    printf("%s\n",datfile);
    return 0;
}

Выход VS2015 (cl / nologo / W4 test.c):

test.c
test.c(10): warning C4047: 'function': 'const char *' differs in levels of indirection from 'int'
test.c(10): warning C4024: 'strcat_s': different types for formal and actual parameter 3

"уровень косвенности" указывает на несоответствие уровня указателя. int, int*, int** имеют разные уровни косвенности.

С предложением @Mat следующая строка изменилась на двойные кавычки:

strcat_s(datfile, strlen(argv[1]) + 4, ".dat");

Компилируется без предупреждений, но вылетает из-за неправильного использования параметров. 2-й параметр для strcpy_s а также strcat_s длина буфера назначения, а не длина строки источника. поскольку strlen(arg[v]) не включает нулевой терминатор, strcpy_s потерпит неудачу, потому что попытается скопировать еще один байт, чем указано.

Правильное использование 2-го параметра:

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

int main(int argc, char* argv[])
{
    char datfile[127];
    if(argc < 2)
        return -1;
    strcpy_s(datfile, sizeof datfile, argv[1]);
    strcat_s(datfile, sizeof datfile, ".dat");
    printf("%s\n",datfile);
    return 0;
}

Выход:

C:\>cl /nologo /W4 test.c
test.c

C:\>test abc
abc.dat
Другие вопросы по тегам