третий аргумент strncpy изменяет мою локальную переменную - PullRequest
0 голосов
/ 04 августа 2020
 char activeip[11]="0123456789";
char buffer[1001];
int MAX_SIZE = 1000;

printf("MAX_SIZE %d\n", MAX_SIZE);

strncpy(buffer, "string here.......  ",MAX_SIZE+1);
printf("MAX_SIZE %d\n", MAX_SIZE);

strncpy(&buffer[strlen(buffer)],activeip,MAX_SIZE+1 );
printf("MAX_SIZE %d\n", MAX_SIZE);

strncpy(&buffer[strlen(buffer)],"Long string here.....................................", MAX_SIZE+1);
printf("MAX_SIZE %d\n", MAX_SIZE);
puts(buffer);

как видите, я инициализировал MAX_SIZE равным 1000. когда MAX_SIZE не больше буфера, MAX_SIZE становится равным нулю. вывод кода выглядит следующим образом:

MAX_SIZE 1000
MAX_SIZE 0
MAX_SIZE 0
string here.......  0123456789L

Process finished with exit code 0

как может функция (strncpy изменить мою локальную переменную (MAX_SIZE)? мой компилятор minGW работает на CLion, спасибо за ваш ответ

Ответы [ 2 ]

1 голос
/ 04 августа 2020

Эти вызовы

strncpy(&buffer[strlen(buffer)],activeip,MAX_SIZE+1 );

и

strncpy(&buffer[strlen(buffer)],"Long string here.....................................", MAX_SIZE+1);

добавляют массив, на который указывает первый аргумент, с MAX_SIZE + 1 минус длина скопированной строки с нулями.

Согласно стандарту C (7.23.2.4 Функция strncpy)

3 Если массив, на который указывает s2, является строкой, которая короче n символов, нулевых символов добавляются к копии в массиве, на который указывает s1, пока не будут записаны n символов.

Таким образом, память за пределами буфера массива перезаписывается. Вам нужно изменить значение третьего аргумента, сделав его меньше (с учетом длины скопированной строки и используемого смещения в массиве символов).

0 голосов
/ 05 августа 2020

относительно таких операторов, как;

strncpy(&buffer[strlen(buffer)],activeip,MAX_SIZE+1 );

Это не лучший способ добавить эту activeip строку. Предложите:

strcat( buffer, activeip );

или

strncat( buffer, activeip, sizeof(buffer) - strlen buffer );
...