使用 memset 进行初始化的 C 动态分配数组

Posted

技术标签:

【中文标题】使用 memset 进行初始化的 C 动态分配数组【英文标题】:C dynamic allocated array using memset for initialisation 【发布时间】: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)); 【参考方案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。

【讨论】:

以上是关于使用 memset 进行初始化的 C 动态分配数组的主要内容,如果未能解决你的问题,请参考以下文章

二维数组的动态分配(new)初始化(memset)和撤销(delete)

正确使用 memset 与动态分配的多维数组

对二维数组的“memset”的混淆和“free”的错误

二维对象数组 c 锐利的动态值分配

c语言里有memset()怎么用?需要啥头文件?

老生常谈,正确使用memset