| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1046 人关注过本帖
标题:这个程序能正常运行但被告知存在问题,问这样写法问题具体体现在哪里?~
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏
已结贴  问题点数:20 回复次数:3 
这个程序能正常运行但被告知存在问题,问这样写法问题具体体现在哪里?~
程序代码:
#include<stdio.h>

int main( void )
{
    float a;
    *(char**)&a="hello world";

    printf("%s\n",*(char**)&a);
    
    return 0;
}


这个程序能正常输出"hello world",而且我这个编译器也没有任何警告提示,但被人类告知这样写是错误的!就是问问这个错误具体体现在哪里?最好能够详细讲解一下,先谢过了~
搜索更多相关主题的帖子: 运行 存在 char world 错误 
2018-05-05 22:46
童生
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:205
专家分:455
注 册:2018-3-7
收藏
得分:20 
浪费了一点内存
2018-05-06 12:58
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
人类简单说明了一下运行结果

程序代码:
程序代码:
#include<stdio.h>

int main( void )
{
    int x=1;
    float a;
    *(char**)&a="hello world";
    int y=2;

    printf("%s\n",*(char**)&a);
    printf("x=%d\n",x);
    printf("y=%d\n",y);
    
    return 0;
}


这个代码32位操作系统是
x=1
y=2

但64位操作系统就是
x=0
y=2

也就是说64位指针占8个字节,但float只是占4个字节,这样把float强制转换成指针类型再赋值这样会修改了其它内存空间的数据 所以二楼的说法是有一定道理的~

借楼,最近就是在弄这些东西
程序代码:

程序代码:
#include<stdio.h>

#pragma pack(push,1)

struct s
{
    int a;
    char b;
    struct
    {
        int ca;
        char cb[2];
    }*c;
};

#pragma pack(pop)

void* _alloc( void );
void _fill( void* );
void _read( struct s* );
void _free( void** );

int main( void )
{
    void* p=_alloc();
    
    _fill(p);
    
    _read((struct s*)p);

   _free(&p);
    
    return 0;
}

#include<stdlib.h>

void* _alloc( void )
{
    void* p=malloc(sizeof (int)+sizeof (char)+sizeof (void*));

   *(p+sizeof (int)+sizeof (char))=malloc(sizeof (int)+2*sizeof (char));
   
   printf("Entry=%p\n",p);
    
    return p;
}

void _fill( void* p )
{
    *(int*)p=1;
    *(char*)(p+sizeof (int))='2';
    **(int**)(p+sizeof (int)+sizeof (char))=3;
    *((*(char**)(p+sizeof (int)+sizeof (char)))+sizeof (int))='4';
    *((*(char**)(p+sizeof (int)+sizeof (char)))+sizeof (int)+sizeof (char))='5';
    
}

void _read( struct s* p )
{
    printf("p->a=%d\n",p->a);
    printf("p->b=%c\n",p->b);
    printf("p->c->ca=%d\n",p->c->ca);
    printf("p->c->cb[0]=%c\n",p->c->cb[0]);
    printf("p->c->cb[1]=%c\n",p->c->cb[1]);
}

void _free( void** p )
{
    free(*(void**)(*p+sizeof (int)+sizeof (char)));
    free(*p);
    *p=NULL;
}



说要一个正常学习的大学生要用指针填这些结构体,想想没几个能弄出来也是正常不过的事情~

[此贴子已经被作者于2018-5-6 14:25编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2018-05-06 14:11
童生
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:205
专家分:455
注 册:2018-3-7
收藏
得分:0 
C本质上就无法跨平台,C及C++所谓的跨平台是指源码级上的跨平台(一次编写,到处编译么),所以才会有如此多的陷井.
2018-05-06 14:55
快速回复:这个程序能正常运行但被告知存在问题,问这样写法问题具体体现在哪里?~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019487 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved