指针在递增时会重新分配内存吗?
does the pointer reallocate memory as it increments?
我怎样才能阻止 *str 填充我没有给它的内存,而不必添加结束条件,在这种情况下是:i <= n
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] = '[=11=]';
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] = '[=10=]';
}
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;
}
我怎样才能阻止 *str 填充我没有给它的内存,而不必添加结束条件,在这种情况下是:i <= n
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] = '[=11=]';
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] = '[=10=]';
}
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;
}