[英]possibility of memory overwrite using pointers in c?
我在K&R c书之后写了自己的getline
函数
void getline(char * const str)
{
int c;
char* temp = str;
while ((c=getchar()) != '\n') {
*temp = c;
temp++;
}
*temp = '\0'
}
它用于初始化字符串
char *str1, *str2;
printf("Type string 1: ");
getline(str1);
printf("Type string 2: ");
getline(str2);
只是想知道,如果存储位置str1
和str1
指向的位置非常接近,那么getline(str2)
覆盖字符串1中的内容怎么办?
有可能我怎么避免呢? 谢谢!
是的,程序停止执行上述代码片段,但以下代码有效:
#include <stdio.h>
main()
{
char* str;
char* temp = str;
int c;
while ((c=getchar()) != '\n') {
*temp = c;
++temp;
}
*temp = '\0';
printf("%s\n", str);
}
这里的str
也是未初始化的字符指针,但是为什么它不会给我一个错误?
您拥有的是未定义行为 。
您声明了两个指向char
指针:
char *str1, *str2;
但您尚未初始化它们。 它们指向未初始化的某个“随机”存储位置。
然后,将str1
和str2
传递到getline
以及此处:
char* temp = str;
temp
指向str
指向的位置。 然后,在循环中
*temp = c;
您写入此存储位置。 这将写入无效的内存位置。 并调用UB 。
您可以使用固定大小的自动数组:
char str1[101], str2[101];
请注意,您应该在getline
函数的循环中添加一个检查,当用户输入100个字符时,该循环会中断循环,以免缓冲区溢出 。
更好的解决方案是使用动态内存分配。 您需要为此使用malloc
和realloc
。 这些功能需要stdlib.h
标头。
固定代码 (未经测试) :
char* getline() { char* str; int c, size = 10, counter = 0; str = malloc(size); /* Allocate `size` memory */ if(str == NULL) { printf("malloc failed to allocate memory"); exit(-1); /* Exit the program */ /* Or return NULL; */ } while ((c = getchar()) != '\\n' && c != EOF) { /* Added check for EOF as well */ str[counter] = c; counter++; if(counter == size) { char* temp = str; /* Backup in case realloc fails */ size += 10; /* Which is the same as `size = size + 10` */ str = realloc(str, size); /* realloc size(20) memory */ if(str == NULL) /* If realloc failed */ { printf("reallocing memory failed"); str = temp; /* str is NULL, retrieve the original contents */ break; /* Break out of the loop */ } } } str = realloc(str, counter + 1); /* realloc `counter + 1` memory */ str[counter] = '\\0'; return str; }
在调用函数中
char* str1 = getline(); if(str1) puts(str1); free(str1); char* str2 = getline(); if(str2) puts(str2); free(str2);
str1
和str2
未初始化,因此将是未定义的行为。 您可以访问不允许的内存,这将使您的程序崩溃。
您必须为每个指针分配足够的内存,并传递其大小以获取行函数,以确保仅在分配的内存中写入。
str1
和str2
初始化。现在,您在调用UB的无效(或未授权)存储位置写入( *temp = c;
)。
首先,您需要为str1
和str2
分配内存。
str1=malloc(100); // check return
str2=malloc(100);
为了能够写入该内存位置。
只是想知道,如果内存位置str1和str1指向的位置非常接近,那么getline(str2)会覆盖字符串1中的内容,那怎么可能呢?
而且就您而言,由这些malloc
分配的malloc
不会重叠(将是两个不同的可感染内存块),因此,如果您还倾向于写超出这些内存位置的内容,则会调用未定义的行为 ( 如果您遇到了幸运的分段错误) )。 因此,恕我直言,不会发生str2
覆盖str1
任何情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.