【问题标题】:C dynamic allocated array using memset for initialisation使用 memset 进行初始化的 C 动态分配数组
【发布时间】:2016-01-17 23:07:59
【问题描述】:

所以我制作了一个关于动态分配的 char 数组的程序,该程序尚未完成,但在我运行程序后我得到了一些不同的返回值,没有警告,编译器中没有错误所以我不'不知道为什么有时程序会崩溃..

#include <stdlib.h>
#include <stdio.h>
#include <malloc.h>
#include <string.h>
int main(){
int n,i;
char *tab=NULL;
printf("New size of array: ");
scanf("%d",&n);
tab=(char*)malloc(n*sizeof(char));
memset(tab,'X',n*sizeof(tab));
for(i=0;i<n;i++)
    printf("%c",tab[i]);
free(tab);
return 0;
}

【问题讨论】:

  • memset(tab,'X',n*sizeof(tab)); --> memset(tab,'X',n*sizeof(*tab));

标签: c memory malloc memset


【解决方案1】:

在你的 memset 中你写 n * sizeof(tab),我想你想写: n * sizeof(char)

您还可以在 malloc 末尾添加 +1 并检查返回值,以确保安全。

【讨论】:

  • 谢谢你成功了 :D 但这很奇怪,因为我从一本书中获取 memset 的 sintax,它是这样的:memset(target, NULL, sizeof(target));
  • 。你的书不是很清楚。而不是 sizeof(target) 认为长度。我邀请您阅读有关它是干净的手册页。在你的情况下 n * sizeof(char) 因为你的标签包含一定数量的 char
  • 这种情况下也可以使用 sizeof *tab
【解决方案2】:

C 库函数 void *memset(void *str, int c, size_t n) 将字符 c(一个无符号字符)复制到参数 str 指向的字符串的前 n 个字符。

memset(tab,'X',n*sizeof(char));

您已经编写了 n*sizeof(tab),您正在将字符 X 复制到未知内存中,这可能会在运行时导致崩溃。

【讨论】:

    【解决方案3】:

    查看这一行:

    memset(tab,'X',n*sizeof(tab));
    

    你将tab声明为指针,指针的存储大小超过一个字节。将它乘以你想要的数组的大小会导致你将数据复制到你不允许访问的内存空间,这就是你得到分段错误的原因。

    如果必须使用 sizeof,请执行以下操作:

    memset(tab,'X',n*sizeof(char));
    

    或者更好,只需这样做:

    memset(tab,'X',n);
    

    因为 char 是一个字节,n 乘以 1 = n。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-30
      • 2010-11-05
      • 1970-01-01
      • 2020-05-04
      • 1970-01-01
      • 2011-03-24
      相关资源
      最近更新 更多