关于指针分配内存和超出内存空间的问题

作者:超级管理员 更新时间:2017-09-12 17:56:19 来源:未知 点击:15642
分配指针内存空间的时候的一些疑问:typeof struct people {       char *name;       int age;} student;student *p;p = (st
分配指针内存空间的时候的一些疑问:

typeof struct people {
       char *name;
       int age;
} student;

student *p;

p = (student *)malloc(siezeof(student *));
p = (student *)malloc(siezeof(student));


上面两条分配内存空间的差别是sizeof后面的类型不同,多一个星号和少一个星号有什么区别?
还有是否能这样这样分配内存?
char *p;
p = (char *)malloc(sizeof(char *));
如果可以 那么跟
p = (char *)malloc(sizeof(char));
的差别又是什么?


假如我一个指针已经分配了内存空间,但是当它指向超出其内存空间范围的地址并赋值的时候会有什么后果呢?

char *p;
p = (char *)malloc( 3 * sizeof(char) );
p[4] = 'a';

多一个星和少一个星,对于这个结构体而言,申请的字节数不一样。
多一个星的,申请的是一个指针的长度,对于32为系统,一个指针占4个字节,即申请的是4个字节。
少一个星的,申请的是一个结构体的长度,即8个字节长度;

对于char *p而言,区别也是申请的长度不一样,带星的是4个字节,不带的是1个字节。
记住sizeof是计算类型长度的,或者是变量类型长度。
后果很严重,越界访问会造成数据不正确或者直接非法地址访问,提示段错误。

其实电脑开机后物理内存的每个字节中都有值且都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。

记住,在32位系统下,所有的指针对象都是4个字节的。
p = (char *)malloc(sizeof(char *));申请了4个字节的内存大小
p = (char *)malloc(sizeof(char ));申请了1个字节的内存大小。

引用 2 楼 zhao4zhong1 的回复:
其实电脑开机后物理内存的每个字节中都有值且都是可读写的,从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页,一页通常为4KB。

最近在Linux系统上看Redis源码,在字典操作涉及到散列表的实现的时候使用的是一个二级指针存储键值对结构体,在一开始的时候只给二级指针分配了4个字节的内存空间,然后会因为键值对的key进行哈希得到的数字作为二级指针第二维的下标,在其过程中不排除会有下标是越过二级指针的内存空间的情况,在后续过程中才会不定时地对二级指针进行remalloc操作,请问这种操作方式也是合法安全的吗?会不会有其他程序操作导致说刚好二级指针的内存空间还没重新扩容,但是二级指针内存空间范围外的本来已存储好的数据被刷掉的情况?

多线程需要加锁。
使用realloc的正确姿势参考下面:
//输出PROG中有但LIST中没有的文本行,即集合PROG-LIST
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <search.h>
#define MAXCHARS 512
int MAXLINES=10000,MAXLINES2;
char *buf,*buf2;
char PROG[256]="PROG";//程序Program需要的文件列表
char LIST[256]="LIST";//dir /b /s生成的实际文件列表List
FILE *fp,*fl;
int i,c,n,L,hh;
int ignore_case=0;
char ln[MAXCHARS];
int icompare(const void *arg1,const void *arg2) {
   return stricmp((char *)arg1,(char *)arg2);
}
int compare(const void *arg1,const void *arg2) {
   return strcmp((char *)arg1,(char *)arg2);
}
int main(int argc,char **argv) {
    if (argc>1) strcpy(PROG,argv[1]);//命令行参数1覆盖PROG
    if (argc>2) strcpy(LIST,argv[2]);//命令行参数2覆盖LIST
    if (argc>3) ignore_case=1;//若存在命令行参数3,忽略大小写
    if ((fl=fopen(LIST,"rt"))==NULL) {
        fprintf(stderr,"Can not open %s\n",LIST);
        fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]);
        return 1;
    }
    if ((fp=fopen(PROG,"rt"))==NULL) {
        fclose(fl);
        fprintf(stderr,"Can not open %s\n",PROG);
        fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]);
        return 2;
    }
    buf=(char *)malloc(MAXLINES*MAXCHARS);
    if (NULL==buf) {
        fclose(fl);
        fclose(fp);
        fprintf(stderr,"Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES,MAXCHARS);
        return 4;
    }
    n=0;
    hh=0;
    i=0;
    while (1) {
        if (fgets(ln,MAXCHARS,fl)==NULL) break;//
        hh++;
        L=strlen(ln)-1;
        if ('\n'!=ln[L]) {//超长行忽略后面内容
            fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",LIST,hh,MAXCHARS);
            while (1) {
                c=fgetc(fl);
                if ('\n'==c || EOF==c) break;//
            }
        }
        while (1) {//去掉行尾的'\n'和空格
            if ('\n'==ln[L] || ' '==ln[L]) {
                ln[L]=0;
                L--;
                if (L<0) break;//
            } else break;//
        }
        if (L>=0) {
            strcpy(buf+i,ln);i+=MAXCHARS;
            n++;
            if (n>=MAXLINES) {
                MAXLINES2=MAXLINES*2;
                if (MAXLINES2==1280000) MAXLINES2=2500000;
                buf2=(char *)realloc(buf,MAXLINES2*MAXCHARS);
                if (NULL==buf2) {
                    free(buf);
                    fclose(fl);
                    fclose(fp);
                    fprintf(stderr,"Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES2,MAXCHARS);
                    return 5;
                }
                buf=buf2;
                MAXLINES=MAXLINES2;
            }
        }
    }
    fclose(fl);
    if (ignore_case) qsort(buf,n,MAXCHARS,icompare);
    else qsort(buf,n,MAXCHARS,compare);
    hh=0;
    while (1) {
        if (fgets(ln,MAXCHARS,fp)==NULL) break;//
        hh++;
        L=strlen(ln)-1;
        if ('\n'!=ln[L]) {//超长行忽略后面内容
            fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",PROG,hh,MAXCHARS);
            while (1) {
                c=fgetc(fp);
                if ('\n'==c || EOF==c) break;//
            }
        }
        while (1) {//去掉行尾的'\n'和空格
            if ('\n'==ln[L] || ' '==ln[L]) {
                ln[L]=0;
                L--;
                if (L<0) break;//
            } else break;//
        }
        if (L>=0) {
            if (ignore_case) {
                if (NULL==bsearch(ln,buf,n,MAXCHARS,icompare)) printf("%s\n",ln);
            } else {
                if (NULL==bsearch(ln,buf,n,MAXCHARS,compare)) printf("%s\n",ln);
            }
        }
    }
    fclose(fp);
    free(buf);
    return 0;
}

student *  是指针类型,32位机中占4个字节
student  是结构体类型,占8个字节

推荐阅读

热门内容

请问一下遍历图像的时候 这种ALU写法为

就是遍历图像的时候, 一次处理2个像素或...

if else 两个语句为什么同时执行了

我的程序里有一个if判断,在dubug下...

求助一个计算问题?

#include in...

请解惑,关于QT用C++写串口通信时的一

我把代码贴出来吧,请帮我看看是哪里出了问...

已添加头文件,但报错找不到标识符

引用错误1error C3861: “r...

错误2365,怎么解决啊,求助

如图这么多短变量名放一块儿,很容易重名的...

感觉现代c++不如d语言

功能都是那些功能,现代c++的实现语法太...

逐行读取文件+并发处理,和先读入整个文件

文本的每一行都是一条记录,程序要求对每条...

C语言新手求助,输出的数字非常大

本帖最后由z4164362于2017-0...

c小白 求帮帮忙

# include #...

最新内容

调用静态类报空指针,求解

class LoanUtil    @Autowired     public ...

两个实体类转换异常如何解决

java.lang.ClassCastException: com.finego...

新手上路 求罩

如果我   String  str =" , , BS_STATIC_DATA,...

tomcat 部署项目访问404

公司买了一个项目,原本可以访问,自己重新部署就404了他原来的配置

求教一段scala代码,晕菜了,初学

package testimport scala.io.Sourceclass ...

创建maven module失败

怎么回事啊?什么情况呢?----------------------------...

spring配置出错

在配置spring配置文件后进行单元测试时报错,是不是jdk版本和spring版...

jdk1.8和jdk1.7中HashMap实现了Map.Entry接口的静态内部类的方法名为什么不同?

本帖最后由kai_12于2017-09-1120:08:16编辑今天学习Hash...

明明有分号,怎么还提示没有分号

-------------------------------这里是说明你程序写...

求修改一段php代码

求修改一下这个php代码,让动态生成的缩略图固定高宽,拉伸不变形,不留空白

关于自定义jar包引入第三方jar包的问题

我在写一个web项目的时候,遇到了这个问题。我自定义的一些工具被我打成jar包然...

php curl连接怎么加参数进去

jsp用ajax提交form表单

没接触过ajax,找了网上的例子试了下。但点了提交没有值传回来,不知道哪里出错了...

php curl怎么提取文件内容,本人小白,麻烦大神解释一下谢谢

后台代码

关于HQL的一个报错

本帖最后由zxy16305于2017-09-0809:59:07编辑在bean中...

关于微博等第三方登陆接口

各位大神,我在用微博登陆网站时,用了微博的demo,能够实现登陆,但是有几个问题...

深圳IT小白找工作可以这么难吗?

        在各个招聘网上看到的招聘不是什么不要工作经验就是什么包吃住还有就...

关于静态static的疑惑

1.int f(int n){static int i = 1;n += i;i...

请问在Eclipse创建Layout如何调用真机测试呀?

如图,本人刚入门安卓,安装也是折腾了好久才安装完,实在不想用里面的模拟器...开...

想做一个只接收数据的客户端,服务器是一个不断无条件发送数据的服务器,该怎么办?

import java.io.BufferedReader;import jav...