此问题已在此处有答案:
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))
1条答案
按热度按时间5lwkijsr1#
似乎您期望
printf("%d\n", sizeof(*stringa) / sizeof(*stringa[0]));
打印分配给*stringa
的字符数。如果是,那么答案是:你的期望是错误的。
让我们后退一步。
对于数组,像
将给予数组元素的数量。
例如:
将值4分配给
elements
。但这不是你在做的。
您的
stringa
不是数组。您的stringa
变量具有类型指针指向一个char的指针。因此,
*stringa
具有类型指向char的指针。所以
sizeof(*stringa)
与sizeof(char*)
相同stringa[0]
也是一个指向char的指针,因此*stringa[0]
是一个char。这意味着sizeof(*stringa[0])
与sizeof(char)
相同。现在我们可以重写了
成为
因为
sizeof(char)
总是1,我们甚至可以把它写成一个指针的大小是一个固定的数字。它不改变取决于它指向的内存量。在大多数64位系统(如果不是全部)上,指针的大小是8。这就是为什么打印语句总是显示8。
顺便说一句:
*stringa[i++]
没有做你所期望的事情。检查运算符优先级。reverse = ...
应该是*reverse = ...
OT:
代码以size = 1开始。你还没有向我们展示你是如何调用这个函数的,所以它可能是正确的/有意的,但它似乎相当奇怪。你真的希望调用者提供一个**指针指向一个已经指向一个动态分配的字符的指针吗?对我来说,这是一个非常奇怪的函数API。