免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: packard
打印 上一主题 下一主题

请教不用sizeof如何判断数组大小 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2005-12-12 00:52 |只看该作者
呵呵,哪位来分析下吧

  1. int f(int i)
  2. {
  3.         int aa[i];
  4.         printf("%d\n",sizeof(aa));
  5.         return 0;
  6. }

复制代码

  1.     .file   "d.c"
  2.     .section    .rodata.str1.1,"aMS",@progbits,1
  3. .LC0:
  4.     .string "%d\n"
  5.     .text
  6. .globl f
  7.     .type   f, @function
  8. f:
  9.     pushl   %ebp
  10.     movl    %esp, %ebp
  11.     subl    $24, %esp
  12.     movl    %ebx, -4(%ebp)
  13.     movl    %esp, %ebx
  14.     movl    8(%ebp), %eax
  15.     decl    %eax
  16.     sall    $2, %eax
  17.     leal    4(%eax), %edx
  18.     addl    $19, %eax
  19.     andl    $-16, %eax
  20.     subl    %eax, %esp
  21.     movl    %edx, 4(%esp)
  22.     movl    $.LC0, (%esp)
  23.     call    printf
  24.     movl    %ebx, %esp
  25.     movl    $0, %eax
  26.     movl    -4(%ebp), %ebx
  27.     movl    %ebp, %esp
  28.     popl    %ebp
  29.     ret
  30.     .size   f, .-f
  31.     .section    .note.GNU-stack,"",@progbits

复制代码

论坛徽章:
0
12 [报告]
发表于 2005-12-12 14:50 |只看该作者

回复 12楼 ktdid 的帖子

嗯,谢谢12楼的回复。不管怎样,毕竟也敲了不少东西,受益不少。
虽然有点汇编基础的人就应该能看明白那些反汇编调用关系,而且愿意用google的人应该会知道sizeof是一个操作符。但还是很感谢给了我一个复习的机会:)
我发这个帖子不是要吵架,目的是为了解决问题,可是问题没解决,老听到老气横秋的
教训,有些不爽。
Expert C Programming 里面也有对sizeof的描述,你说的那些东西,上面基本都讲了,不过我这人看书一般不太仔细,可能会漏过一些东西,所以才会有此困惑想要请教,我会再好好看看。可是就算我看过了,难道就不允许拿出来讨论了?sizeof是怎么实现的,你一句“其实就跟讨论a+b的+如何实现一样,有点荒诞”就轻描淡写掠过了,不是搞技术的人该有的风格吧。不过高手一般都不愿意解答这种粗浅问题,我只好算了。
还有如果要出面食题考sizeof,建议出些这样的
struct  A{
  int a;
  char str[3];
  union b{
    unsigned short int c;
   char d;
};
};
struct A aa;问sizeof(aa)几何,这比用啥函数调用来考要直接了当。
总结陈词:讨论技术,希望不要人身攻击:)

论坛徽章:
0
13 [报告]
发表于 2005-12-12 15:44 |只看该作者
我向楼主道歉
sizeof那一段确实不是针对你的,我是真的不明白为什么有些看起来挺有知识挺有经验的人非要说sizeof是预编译时处理的
楼主你提的问题,我不也说了解决方法了嘛
态度不好,再次道歉
还有,我不是高手,是俗手,别考我,我啥也不知道

论坛徽章:
0
14 [报告]
发表于 2005-12-12 18:05 |只看该作者

回复 14楼 ktdid 的帖子

:)谦虚了不是
int len(void *p)
{
    printf("%d\n", sizeof(p));
}的结果是4,换成*p是1,我是x86/linux机器,这样做不可以,
嗯,比较想知道编译器遇到sizeof时作了什么事情。

论坛徽章:
0
15 [报告]
发表于 2005-12-21 19:34 |只看该作者
各位大哥,能否给出以下程序的sizeof是多少? 最好能给一些解释

不胜感激

int f(int i)
{
        int aa[i];
        printf("%d\n",sizeof(aa));
        return 0;
}

Windows NT/2000/XP环境,32位编译器
void func(char str[100])
{
    printf("%d\n", sizeof(str));
}

struct  A{
  int a;
  char str[3];
  union b{
    unsigned short int c;
   char d;
};
};

struct A aa;问sizeof(aa)几何

还有,能否解释一下这个程序的结果?
int len(void *p)
{
    printf("%d\n", sizeof(p));
}的结果是4,换成*p是1

论坛徽章:
0
16 [报告]
发表于 2005-12-21 20:03 |只看该作者
不用sizeof是不可以的!

论坛徽章:
0
17 [报告]
发表于 2005-12-26 17:33 |只看该作者
哪位大哥可以回答一下呢?
谢谢啦

论坛徽章:
0
18 [报告]
发表于 2008-06-01 12:53 |只看该作者
很意外,在GOOGLE中搜到这个帖子。
这个正好我也在开发,所以我倒是有一个很傻的办法解
/*
我的思路:创建一个死循环,然后不断地测试边缘,一直到测试到。然后就跳出返回数组数字。
               这个我也没有编译过,不知道正确与否。我写的一个和这个差不多,那个可以编译。所以粗略的写了一下,有些东西如果使用
               还是需要修改过的。
*/
int mysizeof()     //意思差不多,自己写输入内容
{
    int size=0;     //这个就是数组大小
    char Letter[];        //这个赋值与否你自己决定
      for (int q=0;q<q+1;q++)    //创建一个死循环
        {
               if (Letter[q]!='/0')          //测试数组边缘
                size++         
               else {break; }      //跳出循环
         }
      return size;
}

论坛徽章:
0
19 [报告]
发表于 2008-06-01 13:11 |只看该作者
数组边缘怎么测试啊

论坛徽章:
0
20 [报告]
发表于 2008-06-01 13:29 |只看该作者
19楼的不是strlen吗, 怎么成sizeof了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP