ffbiao 发表于 2012-9-25 14:50:02

请大家帮忙看看Nios的C程序,指针总是赋值有问题?

      代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "string.h"

int main()
{
int NSize= 100;
unsigned int *p = NULL;
int j = 0;
unsigned int val;
p = (unsigned int *)malloc(sizeof(int) * NSize);
memset(p, 0, sizeof(int) * 100);
memset(val, 0, sizeof(int ) * 100);
for( j=0; j<5; j++)
{
    *(p++) = j;
    val = j;
    printf("p address:0x%08x context:%d\n",(int)p, *p);
    printf("val address:0x%08x context:%d\n",(int)&val, val);
}
free(p);
p = NULL;
printf("Hello from Nios II!\n");

return 0;
}

感觉没什么错,但是指针部分赋值总是显示数据调试有问题,请大家帮忙看看,指出哪里问题,谢谢!
调试结果显示:
NSize        100       
p        0x0400800e       
        *p        4294967295       
j        5       
val       
        val        0       
        val        1       
        val        2       
        val        3       
        val        4       

monkerman 发表于 2012-9-25 15:46:07

你想要的结果是这样的吧??
p address:0x005017f0 context:0
val address:0x0022fd84 context:0
p address:0x005017f8 context:1
val address:0x0022fd88 context:1
p address:0x00501800 context:2
val address:0x0022fd8c context:2
p address:0x00501808 context:3
val address:0x0022fd90 context:3
p address:0x00501810 context:4
val address:0x0022fd94 context:4
Hello from Nios II!

monkerman 发表于 2012-9-25 15:56:01

for( j=0; j<5; j++)
{
   // *(p++) = j; // 可以搜"C语言副作用, 序列点"
    *(++p) = j; // 但是这样的话, 分配的100个内存中, 第一个就浪费了. 还是用下面的比较好.
// *p = j;// 一
    val = j;
    printf("p address:0x%08x context:%d\n",(int)p, *p); // 没必要强制转换吧? 下面同理
    printf("val address:0x%08x context:%d\n",(int)&val, val);
// ++p; // 二
}

不知道我的理解对不对.

ffbiao 发表于 2012-9-26 08:11:00

monkerman 发表于 2012-9-25 15:56 static/image/common/back.gif
for( j=0; j

多谢monekerman,提供了一个C语言“副作用”的资料学习,这个非常好,写C还是得规范,C“副作用”有点像volitale定义的硬件接口上,防止在寄存器与内存之间突发访问,防止不当的异常值,这是个人观点,请指正!
页: [1]
查看完整版本: 请大家帮忙看看Nios的C程序,指针总是赋值有问题?