所以我做了一个关于动态分配的字符数组的程序,程序尚未完成,但是在运行程序后我得到了一些不同的返回值,没有警告,编译器中没有错误,所以我不知道为什么我得到这个有时程序也会崩溃。
#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;
}
在你的记忆集中你写了 n * sizeof(tab),我想你想写: n * 大小(字符)
您还可以添加 +1 添加 malloc 的末尾并检查返回值,只是为了安全起见。
C 库函数 void *memset(void *str, int c, size_t n) 将字符 c(无符号字符)复制到参数 str 指向的字符串的前 n 个字符。
memset(tab,'X',n*sizeof(char));
您已经编写了 n*sizeof(tab),您正在将字符 X 复制到未知内存,这可能会导致运行时崩溃。
查看此行:
memset(tab,'X',n*sizeof(tab));
您已将 tab 声明为指针,并且指针的存储大小超过一个字节。将其乘以您想要的数组大小的 n 将导致您将数据复制到不允许访问的内存空间,这就是您出现分段错误的原因。
如果必须使用 sizeof,请执行以下操作:
memset(tab,'X',n*sizeof(char));
或者更好的是,只需这样做:
memset(tab,'X',n);
因为 char 是一个字节,n 乘以 1 = n。