繁体   English   中英

在C中使用指针覆盖内存的可能性?

possibility of memory overwrite using pointers in c?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我在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);

只是想知道,如果存储位置str1str1指向的位置非常接近,那么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也是未初始化的字符指针,但是为什么它不会给我一个错误?

3 个回复

您拥有的是未定义行为

说明:

您声明了两个指向char指针:

char *str1, *str2;

但您尚未初始化它们。 它们指向未初始化的某个“随机”存储位置。

然后,将str1str2传递到getline以及此处:

char* temp = str;

temp指向str指向的位置。 然后,在循环中

*temp = c;

您写入此存储位置。 这将写入无效的内存位置。 并调用UB

固定:

  1. 您可以使用固定大小的自动数组:

     char str1[101], str2[101]; 

    请注意,您应该在getline函数的循环中添加一个检查,当用户输入100个字符时,该循环会中断循环,以免缓冲区溢出

  2. 更好的解决方案是使用动态内存分配。 您需要为此使用mallocrealloc 这些功能需要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); 

str1str2未初始化,因此将是未定义的行为。 您可以访问不允许的内存,这将使您的程序崩溃。

您必须为每个指针分配足够的内存,并传递其大小以获取行函数,以确保仅在分配的内存中写入。

str1str2初始化。现在,您在调用UB的无效(或未授权)存储位置写入( *temp = c; )。

首先,您需要为str1str2分配内存。

str1=malloc(100);     // check return 
str2=malloc(100);

为了能够写入该内存位置。

只是想知道,如果内存位置str1和str1指向的位置非常接近,那么getline(str2)会覆盖字符串1中的内容,那怎么可能呢?

而且就您而言,由这些malloc分配的malloc不会重叠(将是两个不同的可感染内存块),因此,如果您还倾向于写超出这些内存位置的内容,则会调用未定义的行为如果您遇到了幸运的分段错误) )。 因此,恕我直言,不会发生str2覆盖str1任何情况。

1 指针内存泄漏的可能性?

我有一个用c ++编写的基本Game类,还有一个Character类,该类将指向游戏的指针作为其构造函数的参数。 我对所有这种新奇的“ C ++”和“指针”爵士乐都还不陌生,因此,如果这似乎是一个愚蠢的问题,请多多包涵。 实际的代码还有很多,但是出于演示目的,我将其压缩了一些: 我的 ...

2 在C中使用指针时防止内存覆盖

我是C语言的新手,我现在开始编写一个简单的程序,该程序在启动后运行, 没有操作系统 ,因此我没有malloc等。 我正在尝试了解内存管理; 看这个例子: 我怎么知道b不会覆盖a呢? 尤其是在编写仅在运行时知道字符串长度的函数时? ...

2015-03-11 14:01:41 2 304   c
3 在C中使用C ++的可能性[关闭]

这可能是一个愚蠢的问题,但我对此非常感兴趣。 是否可以在纯C中实现运算符new ,动态扩展的数组,类? 任何链接或代码示例将不胜感激。 ...

2014-12-15 18:48:47 3 109   c
4 C ++:在开关中使用std :: pair的可能性

我写了例子。 我想在切换条件下使用std :: pair,但是编译器告诉我: 0)在自己的初始值设定项中使用't'; 1)“'t'的值不能在常量表达式中使用” 有可能做出这样的事情还是愚蠢的,我需要阅读标准。 最好的祝福。 ...

2018-07-26 11:17:21 1 139   c++/ c++11
5 在C#中使用通用变量的可能性

我有一个接口IDatabase,它以几种不同的方式访问数据库。 例如,使用RESTful或MySqlDirectConnect。 接下来,我有一个类foo,它具有成员变量A,B,C,需要从数据库中提取数据。 最初,我将为每个成员变量创建一个Get方法。 使用泛型,可以指定要使用 ...

6 在TestComplete中使用“喜欢”的可能性吗?

如何编写一个if语句来搜索相似性而不是直接结果? 例如,我要搜索以ABC开头的标签: 有没有办法做这样的事情:(如果标签像'ABC'),而不是三个单独的if语句? 我知道如果需要的话我可以使用if(),但是我想避免对标签进行硬编码,因为它们可以添加,删除,更新等。 谢谢。 ...

7 CUDA共享内存的可能性

我在了解如何实现CUDA共享内存时遇到了一个问题,因为除了检查某些线程应该执行的计算之外,我没有将线程号用于其他任何事情。 任何人都可以澄清我的猜测是对的,这不可能利用共享内存吗? ...

2015-12-09 09:28:12 1 104   c++/ cuda
9 在PyMC3中使用复杂的可能性

我正在尝试使用具有复杂似然函数的PyMC3: 第一个问题:这可能吗? 这是我尝试使用Thomas Wiecki的帖子作为指南: 它产生关于y_est表达式的以下消息: TypeError :('ofano函数的错误输入参数,名称为“:42”,索引0(从0开始)', ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM