【问题标题】:prevent strings overflowing in c防止字符串在c中溢出
【发布时间】:2015-08-13 20:38:39
【问题描述】:

使用 C 我想分配最大初始字符串长度的堆空间,在我的情况下为 6,然后 每次字符串即将溢出时,将可用空间加倍。 我想按字符构建字符串。

size_t nstring = 6;
char *arr =  malloc(nstring);

int i;
for (i = 0; i < 55;i++){

        if (i == nstring) {
                printf("mAx sized!!");
                arr = realloc(arr, nstring*2);
                nstring = nstring*2;
            }
    arr[i] = 'f';

}
arr[i] = '\0';
printf("length %lu\n", strlen(arr));
free(arr);

【问题讨论】:

  • 问题是......?
  • 此代码不起作用它说下一个尺寸无效
  • 您一直在使用未初始化的内存。你没有 NULL 终止符,你的 strlen 坏了,你正在重新分配没有边界
  • 从 16 而不是 6 开始。内存管理器(在大多数系统上)无论如何都会四舍五入到 16 的倍数。
  • @GarrGodfrey - 不,在循环之前,以及在每个 arr[i] = 'f'; 之后,如果只有一个数组项被初始化,因为这会超过之前的 NULL。否则,strlen 不会返回“正确”的结果。

标签: c string pointers malloc overflow


【解决方案1】:

sizeof 是指针的大小,而不是它指向的数据的大小。

改变

nstring = sizeof(arr) + 1;

nstring = nstring*2;

请记住,arr 是一个指针,而指针始终是地址的大小(4 表示 32 位,8 表示 64 位等)。

编辑: 这不是唯一的问题。完成后,您还需要添加空终止符,并且您还需要在打印语句中使用“sizeof(arr)”。您还需要解决这些问题。

【讨论】:

  • 没有标准的方法来确定您分配的内存大小。您需要自己跟踪它,您已经使用 nstring 进行了跟踪。但是 sizeof 并没有给你你想要的。
  • 我现在编辑了它编译并运行良好的代码,它修复了吗?非常感谢您的帮助!
  • 您实际上是在循环中调用 strlen 。我之前没有注意到,但@amit 注意到了。您可以只使用 i 而不是 strlen,因为长度将始终与 i 相同。如果不更改,循环中的 strlen 调用将超出字符串的末尾。
【解决方案2】:

在 Garr Godfrey 和 Amit 的帮助下,我找到了这个解决方案。

size_t nstring = 6; 
char *arr =  malloc(nstring);

int i;
for (i = 0; i < 55;i++){

        if (i == nstring) {
                printf("mAx sized!!");
                arr = realloc(arr, nstring*2);
                nstring = nstring*2;
            }
    arr[i] = 'f';

}
arr[i] = '\0';
printf("length %lu\n", strlen(arr));
free(arr);

【讨论】:

  • 唯一的潜在问题是您在添加空终止符之前不检查大小。可以通过将检查更改为“if (i+1 == nstring)”来修复
猜你喜欢
  • 2022-11-25
  • 2016-07-13
  • 2021-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-22
  • 2021-01-10
  • 1970-01-01
相关资源
最近更新 更多