由于你定义的 a 只是一个指针 因此sizeof(a)并非数组所占内存容量 而是int* 类型所占内存容量。
#include <stdio.h>
#include <string.h>
int main(){
int n;
scanf("%d", &n);
char* a = new char[n];
memset(a, -1, sizeof(*a) * n);
for(int i=0; i<n; i++) printf("%d\n", a[i]);
return 0;
}
多谢~
1、理解memset的定义:对指定地址下的连续n个单元设置为指定的初始值。
a. 指定地址:第一个参数,说明要处理的数据空间起始地址
b. n个单元:有几个意思,单元是指针的数据类型,n一般的是指空间大小(元素数量)。此外,n个单元的值不是n,而是n倍数据单元大小(元素大小),亦即实际的字节空间。
c. 初始值:是基于单元的初始值,不是基于字节的初始值。
2、理解sizeof:返回的是a这个对象的元素的大小(a是数组,如果是类、结构则是实际大小)。这也是你的问题,只是初始化了第一个单元,具体解决方案1楼有给出。
3、注意n个单元的关键性,如果不超出a的空间范围,则问题不大(只是未完全初始化),如果超出,则将导致系统崩溃!这个也是为什么C/C++程序编写的难点。好在,现在的某些编译系统能做简单的检测(但不能抱这个希望)
谢谢了~
一个整形数组还new,new了也不delete。
因为sizeof(x)给出的是x类型的大小, char* a,a 是个指针类型,所以sizeof(a)是指针大小。