如何解决指针是否在增加时重新分配内存?
如何阻止 *str 填充我没有给它的内存,而不必添加结束条件,在这种情况下是:i
do{
//instructions;
} while (... && i <= n);
在这个例子中,我只为 *str 保留了 3 个字节 的内存,但是当我运行我的代码并输入超过 3 个字符时它仍然有效......如何发生这种情况不应该给出错误,因为其余字符没有足够的内存吗?如果选定的空地址是 xxxxx1 xxxxx2 xxxxx3 然后 xxxxx4 已满,它会停止并仅输出 3 个字符而没有错误怎么办? P.s :我知道函数 gets() 但我不想使用它,因为它会重新分配内存。我认为通过逐个字符输入我将解决问题并阻止用户填充指针,因为这次没有内存重新分配并且 *str 只有 3 个内存块,所以其余的都会去到缓冲区,*str 将停在 *(str + 2) 希望您理解问题并感谢您的回答
#include <stdio.h>
#include <string.h>
#include <malloc.h>
int main()
{
int i = -1,n = 3;
char *str = (char *)malloc(n*sizeof(char));
printf("Enter a string: ");
do
{
i++;
str[i] = getchar();
} while (str[i] != '\n' && i < n);
str[i] = '\0';
printf("Entered string is: %s",str);
return 0;
}
解决方法
C 不对数组或分配的内存执行任何类型的边界检查。这是使其快速的部分原因。
这也意味着读取或写入数组末尾会导致 undefined behavior,这基本上意味着无法保证程序会做什么。该语言相信您会做正确的事情,因此您需要确保不做不该做的事情。
此外,gets
不会重新分配内存。实际上,根本不应该专门使用它,因为它不执行任何边界检查。
如果输入字符串的长度超过两个字符,您的示例将不起作用,因为它会尝试写入数组之外的内容。当您尝试在数组之外写入时会发生什么是未定义的,这意味着它可能在某些情况下纯粹是偶然地工作。试试这个安全函数,它总是读取整行并在必要时截断结果:
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void ReadLine(char result[],int resultLen)
{
int ch,i;
assert(resultLen > 0);
i = 0;
ch = getchar();
while ((ch != '\n') && (ch != EOF)) {
if (i < resultLen - 1) {
result[i] = ch;
i++;
}
ch = getchar();
}
result[i] = '\0';
}
int main(void)
{
int n = 3;
char *str = malloc(n);
printf("Enter a string: ");
ReadLine(str,n);
printf("Entered string is: %s\n",str);
free(str);
return 0;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。