首页 新闻 会员 周边

c++ memset(a, -1, sizeof(a)) 为什么没有把所有的值设为-1?

0
悬赏园豆:50 [已解决问题] 解决于 2015-04-01 12:52

如题, 使用memset想把数组中所有元素设为-1 结果却得到如下结果。

 1 #include<cstdio>
 2 #include<iostream>
 3 
 4 int main()
 5 {
 6     int n;
 7     scanf("%d", &n);
 8     int *a = new int [n];
 9     memset(a, -1, sizeof(a));
10     for(int i = 0 ; i < n; i++)
11         printf("%d\n", a[i]);
12 }
View Code

phoenixdante的主页 phoenixdante | 初学一级 | 园豆:157
提问于:2015-04-01 01:06
< >
分享
最佳答案
1

由于你定义的 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;
}

收获园豆:25
Ant° | 菜鸟二级 |园豆:227 | 2015-04-01 01:35

多谢~

phoenixdante | 园豆:157 (初学一级) | 2015-04-01 12:53
其他回答(3)
1

1、理解memset的定义:对指定地址下的连续n个单元设置为指定的初始值。

a. 指定地址:第一个参数,说明要处理的数据空间起始地址

b. n个单元:有几个意思,单元是指针的数据类型,n一般的是指空间大小(元素数量)。此外,n个单元的值不是n,而是n倍数据单元大小(元素大小),亦即实际的字节空间。

c. 初始值:是基于单元的初始值,不是基于字节的初始值。

2、理解sizeof:返回的是a这个对象的元素的大小(a是数组,如果是类、结构则是实际大小)。这也是你的问题,只是初始化了第一个单元,具体解决方案1楼有给出。

 

3、注意n个单元的关键性,如果不超出a的空间范围,则问题不大(只是未完全初始化),如果超出,则将导致系统崩溃!这个也是为什么C/C++程序编写的难点。好在,现在的某些编译系统能做简单的检测(但不能抱这个希望)

收获园豆:25
519740105 | 园豆:5810 (大侠五级) | 2015-04-01 09:13

谢谢了~

支持(0) 反对(0) phoenixdante | 园豆:157 (初学一级) | 2015-04-01 12:53
0

一个整形数组还new,new了也不delete。

envoy | 园豆:210 (菜鸟二级) | 2015-04-01 12:19
0

因为sizeof(x)给出的是x类型的大小, char* a,a 是个指针类型,所以sizeof(a)是指针大小。

努力变瘦 | 园豆:243 (菜鸟二级) | 2015-04-02 17:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册