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

时间:2016-01-17 23:07:59

标签: c memory malloc memset

所以我做了一个关于char数组的程序,该数组是dinamically分配的,程序还没有完成,但我运行程序后得到了一些不同的返回值,没有警告,没有错误编译器,所以我不知道为什么我得到这个也有时程序崩溃..

#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;
}

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:1)

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

您还可以添加+1添加malloc的结尾并检查返回值,仅为了安全起见。

答案 2 :(得分:1)

请看这一行:

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

您将tab声明为指针,并且指针的存储大小超过一个字节。将n乘以所需数组的大小将导致您将数据复制到您不允许访问的内存空间,这就是您遇到分段错误的原因。

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

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

或更好,只需这样做:

memset(tab,'X',n);

因为char是一个字节而n是1 = n。