标题:一个循环赋值的问题
只看楼主
JSTN
Rank: 1
等 级:新手上路
帖 子:4
专家分:5
注 册:2017-8-16
 问题点数:0 回复次数:5 
一个循环赋值的问题
我用的是Visual Studio 2017。

正常情况下代码如下
程序代码:
#include<stdio.h>
#include<conio.h>
int main()
{
    char f1_name[4096], f2_name[4096];
    unsigned long long *ip1, *ip2, *ipe1 = (unsigned long long*)(f1_name + 4096);

    ip1 = (unsigned long long*)f1_name;
    ip2 = (unsigned long long*)f2_name;
    for (; ip1 < ipe1; ip1++, ip2++)
        *ip1 = *ip2 = 0;
    ip1 = (unsigned long long*)f1_name;
    ip2 = (unsigned long long*)f2_name;
    for (; ip1 < ipe1; ip1++, ip2++)
        printf("%llX %llX\n", *ip1, *ip2);
    return 0;
}
输出是两列0。

在赋值前加入输出代码后代码如下
程序代码:
#include<stdio.h>
#include<conio.h>
int main()
{
    char f1_name[4096], f2_name[4096];
    unsigned long long *ip1, *ip2, *ipe1 = (unsigned long long*)(f1_name + 4096);

    ip1 = (unsigned long long*)f1_name;
    ip2 = (unsigned long long*)f2_name;
    for (; ip1 < ipe1; ip1++, ip2++)
    {
        printf("%llX %llX\n", *ip1, *ip2);
    };
    getchar();

    ip1 = (unsigned long long*)f1_name;
    ip2 = (unsigned long long*)f2_name;
    for (; ip1 < ipe1; ip1++, ip2++)
        *ip1 = *ip2 = 0;
    ip1 = (unsigned long long*)f1_name;
    ip2 = (unsigned long long*)f2_name;
    for (; ip1 < ipe1; ip1++, ip2++)
    {
        printf("%llX %llX\n", *ip1, *ip2);
    }
    return 0;
}

为什么在加入代码后输出的第二列不是0,而是一列相同的数字(每次运行不一定一样),例如63006200610060、67006600650064、6B006A00690068?
搜索更多相关主题的帖子: 赋值 include unsigned long for 
2017-08-16 15:10
ldsh304
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:242
专家分:755
注 册:2016-1-18
得分:0 
#include<stdio.h>
#include<conio.h>
int main()
{
    char f1_name[4096], f2_name[4096];
    unsigned long long *ip1, *ip2, *ipe1 = (unsigned long long*)(f1_name + 4096);

    ip1 = (unsigned long long*)f1_name;
    ip2 = (unsigned long long*)f2_name;
    for (; ip1 < ipe1; ip1++, ip2++)
    {
        printf("%llX %llX\n", *ip1, *ip2);    //默认是输出字符串f1_name,f2_name,  他们没有初始化,所以出现的是乱码
    };
    getchar();

    ip1 = (unsigned long long*)f1_name;
    ip2 = (unsigned long long*)f2_name;
    for (; ip1 < ipe1; ip1++, ip2++)
        *ip1 = *ip2 = 0;            //这是给字符串f1_name,f2_name赋值,所有的值都设置为0
    ip1 = (unsigned long long*)f1_name;
    ip2 = (unsigned long long*)f2_name;
    for (; ip1 < ipe1; ip1++, ip2++)
    {
        printf("%llX %llX\n", *ip1, *ip2);        //这里的输出字符串f1_name,f2_name,即输出0
    }
    return 0;
}
2017-08-16 17:16
JSTN
Rank: 1
等 级:新手上路
帖 子:4
专家分:5
注 册:2017-8-16
得分:0 
回复 2楼 ldsh304
我说的是第二个printf语句输出的第二列不是0。为什么不是0我现在还不清楚,不过生成64位程序输出的都是0,生成32位的第二列就不是0。
2017-08-17 11:53
ldsh304
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:7
帖 子:242
专家分:755
注 册:2016-1-18
得分:0 
回复 3楼 JSTN
我使用的是gcc 32位的编译,第二次使用输出的的都是0
2017-08-18 17:42
沓炅
Rank: 2
等 级:论坛游民
帖 子:22
专家分:63
注 册:2017-8-13
得分:0 
为什么不是0呢?因为f1_name  f2_name没有赋值;你只是给ip1  ip2赋值一下,然后又将ip1   ip2赋值给f2_name   f1_name了;所以编译器随便给你一个值;
如果你在*ip1 = *ip2 = 0;哪里断点一下呢?
2017-08-20 00:09
沓炅
Rank: 2
等 级:论坛游民
帖 子:22
专家分:63
注 册:2017-8-13
得分:0 
是这样吗
2017-08-20 00:12



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-480091-1-1.html




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

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