免费注册 查看新帖 |

Chinaunix

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

更改数组大小问题??? [复制链接]

论坛徽章:
0
31 [报告]
发表于 2006-08-20 12:46 |只看该作者
这个 alloca.s 有意思。。

论坛徽章:
0
32 [报告]
发表于 2006-08-20 14:38 |只看该作者
……莫非大家都不用alloca这个函数

论坛徽章:
0
33 [报告]
发表于 2006-08-20 15:06 |只看该作者
原帖由 默难 于 2006-8-20 00:37 发表

-_-||

那你就把你函数库里的alloca函数删除吧,否则太难维护了……

我说是随机数目了吗?我说的是实现一个接口和alloca函数匹配的函数

函数返回之后esp就会返回成调用前的值了……

算了……我懒得解 ...


动不动就是懒得....
看来你是很牛啊
呵呵

论坛徽章:
0
34 [报告]
发表于 2006-08-20 15:17 |只看该作者
原帖由 jeffshia 于 2006-8-20 15:06 发表


动不动就是懒得....
看来你是很牛啊
呵呵

你没发现真正的牛人都根本不再关注这个帖子了吗……否则也不致于为了这么个简单问题在这里纠缠不清了。
我之所以说懒得,完全是因为这种基本概念可以google出来,而且google出来的东西比我讲得清楚多了
其实这个问题的详细解释,我已经通过站内短信,给对这个问题感兴趣的人讲解了。
这种基础问题我觉得没有必要在坛子里头大张旗鼓地帖帖子。当然了,要是有需求,我可以发帖子解释

这个帖子已经完全脱离了技术帖子的范畴了。斑竹看到后有必要做一些处理。

关于alloca的问题,要是有个明白人出来解释一下也好,免得这个帖子误人子弟。

论坛徽章:
0
35 [报告]
发表于 2006-08-20 17:11 |只看该作者
realloc
http://www.opengroup.org/onlinep ... ctions/realloc.html

至于如何将一维数组当二维数组使要自己想办法了。

[ 本帖最后由 x2 于 2006-8-20 17:15 编辑 ]

论坛徽章:
0
36 [报告]
发表于 2006-08-20 18:45 |只看该作者
呵呵,支持 默难。
这个函数还是很好用的,我想 mik 朋友,只要你好好理解了程序运行时的堆栈桢,想清楚这些东西应该不成问题的,还记得你都是写汇编器的高人了,怎么不认真考虑下这个函数的优势和劣势及其使用场合呢?

论坛徽章:
0
37 [报告]
发表于 2006-08-20 23:39 |只看该作者
现在我重新实现了ualloca函数,因为我找不到glibc下这个函数的实现,而 默难 贴的代码改变了edx寄存器的值。大家来讨论讨论,我觉得这个函数很有意义,为了不与系统的函数重名,函数名前面加了个u,汇编代码为:
/*ualloca.S*/
    .text
     .global ualloca
     .align 4
  
ualloca:
    xchgl %ebx, (%esp)          /* so I have change old eip with ebp*/
         
    movl 4(%esp), %eax      /*param*/
    addl $3,  %eax
    andl $-4, %eax          /*  get the off size, considering align*/
   
    subl %eax, %esp             /* allocate space*/
   
    pushl $0                     /* for the caller balance stack,no real use*/
    pushl %ebx                  /* return address*/   
   
    movl 8(%esp,%eax),%ebx    /* recover ebx*/
   
    leal 16(%esp), %eax         /*return value*/
   
    ret



测试用的C函数代码:
#include <stdio.h>
#include <string.h>
#include <stddef.h>

extern void * ualloca(size_t size);

const char* prompt = "yes, Hello, I want to test alloca function\n" ;

int main()
{
     int i = 4;
     printf("%p\n", &i);
         
     char *p = (char*)ualloca( strlen(prompt) +1);

     
     strcpy(p, prompt);
     printf("%p\n", p);   
     printf("%s", p);
     
     printf("the prompt length = %d\n the p lenthg = %d\n",strlen(prompt),strlen(p));
     
     int j = 6;
     printf("%d",j);
     
     getchar();
     return 0;
}

以上代码我在windows下用dev-cpp和rh9下测试通过,不过在dev-cpp下面要将汇编代码ualloca改成_ualloca

[ 本帖最后由 harly 于 2006-8-21 16:33 编辑 ]

论坛徽章:
0
38 [报告]
发表于 2006-08-21 11:33 |只看该作者
通常应该避免使用 alloca 吧, stack overflow 不是好玩的。
特别是大型程序。
apache 2.0.48 中只有 poll 中一个地方使用 alloca
php 511 中 是 #define YYSTACK_ALLOC alloca 只有 3处使用。
而且 都是 #define alloca __buildin_alloca, 使用  inlined code

论坛徽章:
0
39 [报告]
发表于 2006-08-21 12:35 |只看该作者
GCC下面是用的这个宏,但愿变长数组真正取代alloca吧,不过好像也避免不了stack overflow

[ 本帖最后由 harly 于 2006-8-21 16:34 编辑 ]

论坛徽章:
0
40 [报告]
发表于 2006-08-23 18:45 |只看该作者
如果我定义了一个数组
  int int_ary[3][3]={{1,1,1},
                               {2,2,2},
                               {3,3,3}};
现在要把它扩展成 4行4列,
  int int_ary[4][4]={{1,1,1,NULL},
                               {2,2,2,NULL},
                               {3,3,3,NULL},
                               {NULL,NULL,NULL,NULL}};
用分配空间的语句(alloc,malloc,remalloc等)要怎么写
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP