C语言 数组输入中的意外行为[重复]

enxuqcxy  于 2023-06-28  发布在  其他
关注(0)|答案(1)|浏览(105)

此问题已在此处有答案

How do I determine the size of my array in C?(24回答)
7天前关闭
这篇文章是编辑并提交审查6天前.
这个函数应该读取并扩展我的数组(stringa),直到用户按下回车键,然后将reverse扩展到与stringa相同的大小。
但是三个字母之后程序就停止了

void inputStringaAndCreateReverse(char* *stringa, char* *reverse, int* iStringa) {
    int inputChar, i = 0, size = 1;
    bool notEnter = true;
    printf("Insert the string: ");
    while (notEnter) {
        if ((inputChar = getche()) != '\r') {
            *stringa[i] = inputChar;
            i++;
            *stringa = realloc(*stringa, (++size) * sizeof(char));
        } else if (size != 1) {
            notEnter = false;
            system("CLS");
        } else {
            printf("\n");
        }
    }
    *stringa[i] = '\0';
    *iStringa = strlen(*stringa) - 1;
    *reverse = realloc(*reverse, (*iStringa + 1) * sizeof(char));
}

这是一个测试的结果(我想写你好)
hell
stringa和reverse在main中分配为
stringa = (char*) malloc(sizeof(char))

5lwkijsr

5lwkijsr1#

似乎您期望printf("%d\n", sizeof(*stringa) / sizeof(*stringa[0]));打印分配给*stringa的字符数。
如果是,那么答案是:你的期望是错误的。
让我们后退一步。
对于数组,像

sizeof(array) / sizeof(array[0])

将给予数组元素的数量。
例如:

int array[] = {1, 10, 100, 1000};
size_t elements = sizeof(array) / sizeof(array[0]);

将值4分配给elements
但这不是你在做的。
您的stringa不是数组。您的stringa变量具有类型指针指向一个char的指针。
因此,*stringa具有类型指向char的指针。
所以sizeof(*stringa)sizeof(char*)相同
stringa[0]也是一个指向char的指针,因此*stringa[0]是一个char。这意味着sizeof(*stringa[0])sizeof(char)相同。
现在我们可以重写了

sizeof(*stringa) / sizeof(*stringa[0])

成为

sizeof(char*) / sizeof(char)

因为sizeof(char)总是1,我们甚至可以把它写成

sizeof(char*)

一个指针的大小是一个固定的数字。它不改变取决于它指向的内存量。在大多数64位系统(如果不是全部)上,指针的大小是8。这就是为什么打印语句总是显示8。
顺便说一句:
*stringa[i++]没有做你所期望的事情。检查运算符优先级。
reverse = ...应该是*reverse = ...
OT:
代码以size = 1开始。你还没有向我们展示你是如何调用这个函数的,所以它可能是正确的/有意的,但它似乎相当奇怪。你真的希望调用者提供一个**指针指向一个已经指向一个动态分配的字符的指针吗?对我来说,这是一个非常奇怪的函数API。

相关问题