Почему printf() печатает этот загадочный дополнительный текст в Windows?

Недавно я написал простую программу для изменения строки, моя программа просто принимает входную строку от пользователя, а затем меняет ее. Все это делается с помощью 2 указателей. Что касается безопасности указателя в моей программе, я написал функцию для дублирования строки-источника. Эта функция выделяет память для новой строки (такой же длины), а затем копирует символ 1-на-1.

Моя проблема в том, когда я запускаю эту программу, хотя она делает то, что мне нужно, она печатает какой-то таинственный дополнительный вывод. Он делает это каждый раз, прежде чем принимать входные данные от пользователя. Это то, что происходит, когда я запускаю программу.

C:\Users\0xEDD1E\Desktop\revstr>revstr.exe
[C]
[.]
[revstr.exe]
hello
[hello]
olleh

здесь последние три строки: Input и Output, It OK, Проблема в первых трех строках

[C]
[.]
[revstr]

Что это? в любом случае, вот моя программа

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

#define swap(a, b) (((a) ^ (b)) && ((a) ^= (b), (b) ^= (a), (a) ^= (b)))

unsigned long strlen_(char *);
char *strdup(char *s);
char *reverseString(char *, int);

int main(void)
{
    //fflush(stdout);
    char *str = (char *) malloc(1024 * sizeof (char));
    scanf("%[^\n]s", str);
    int slen = strlen_(str);
    printf("%s\n", reverseString(str, slen));
    return 0;
}

unsigned long strlen_(char *s)
{
    char *p = s;
    while (*p) p++;
    return p - s;
}

char *strdup(char *s)
{
    char *p = (char *) malloc((size_t) (strlen_(s) + 1) * sizeof (char));

    if (p) {
        char *pp = p;
        while ((*pp++ = *s++)) ;
    }
    printf("[%s]\n", p);
    return p;
}


char* reverseString(char* s, int n) 
{

    char *str = strdup(s);
    char *p = str - 1;
    char *q = str + n;

    while (++p < --q) {
        swap(*p, *q);
    }

    return str;

}

вы можете видеть, глядя на функцию strdup(), эти строки генерируются printf() в функции strdup() (из-за printf("[%s]\n, str);).

Итак, я думаю, что нашел ошибку. Но я не могу понять причину этой ошибки и способ ее исправить. Особенно это происходит только в Windows (мой Windows 10 Pro). Я тестировал это на Ubuntu (64 бит), в Ubuntu такой ошибки нет.

Мой инстинкт говорит мне, что эта ошибка должна что-то делать с указателями, используемыми в функциях

UPDATE: я пробовал fflush(stdout), но это не помогло

В чем причина этой ошибки (или плохого поведения), может кто-нибудь объяснить причину?

Ответ 1

Вероятно, ваша библиотека системы C также определяет функцию strdup, и некоторый код в запуске программы вызывает эту функцию. Затем компоновщик связывает эти вызовы с вашей функцией strdup вместо системной функции.

Чтобы этого избежать, не называйте свою функцию strdup или str что-то в этом роде: имена, начинающиеся с str, и строчная буква зарезервированы (C11 7.31.12, 7.31.13); использование их в качестве имен функций в вашем собственном коде вызывает поведение undefined.

NB. char *p = str - 1; также вызывает поведение undefined, делая арифметику указателя вне границ любого объекта. (Например, представьте, что str является первым адресом в адресном пространстве). Было бы хорошо перестроить ваш алгоритм, чтобы не указывать за пределы.