免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3900 | 回复: 3
打印 上一主题 下一主题

请教高手,输入缓冲区与指针问题. [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-04-14 17:47 |只看该作者 |倒序浏览
在带形参的main 函数中: 命令行输入缓冲区中的字符串是如何传递给 char **s 的,字符串个数是如何传递给int n的
请高手指点:指向指针的指针变量,与指针数组,有哪些共同点,和区别?
我知道,指针数组名是地址常量,为每个指针元素各开辟4字节的内存空间;**s只有4字节的内存空间它可以存放一个指针变量本身的地址.

在C中:
#include <stdio.h>

int main(int n, char **s)
{
     int i=0;
     printf ("%d",n);

    while (i<n)
         printf ("%s\n",s[i++]);
     return 0;
}

如有命令行: main one two three
1.形参int n 是如何获得4;
2.而**s 的值又是什么? 使s[i++]能指向命行缓冲区中的各字符串.
3.这些缓冲区中的字符是怎么变成字符串的.

论坛徽章:
0
2 [报告]
发表于 2012-04-14 18:57 |只看该作者
本帖最后由 walleeee 于 2012-04-14 18:59 编辑

你该去看程序加载和操作系统原理。

linux是:
/fs/binfmt_elf.c这个文件的create_elf_tables加载elf头,argc等在setup_arg_pages里面加载。

windows也差不多,原理是这样的。就是先根据调用创建进程的字串,解析出其中的参数,放到进程栈上,然后解析执行文件的信息,比如要多大默认栈等等,然后跳到入口执行。

论坛徽章:
0
3 [报告]
发表于 2012-04-15 18:28 |只看该作者
本帖最后由 huangzhenfan 于 2012-04-15 18:31 编辑

getchar() 初步模似 main函数形参


#include <stdio.h>
#include <ctype.h>

int main (void)
{
    int m=0,n=0,i=0,flag=0;
    char array[20][20],c,**p;

    while ((c=getchar())!='\n')
    {
        if (!isspace(c))
        {
            if (flag)
            {
                array[m][n]='\0';
                m++;
                n=0;
            }
            array[m][n++]=c;
            flag=0;
        }
        else if (n>0)
            flag=1;
    }
    array[m][n]='\0';
    int *s[m]; /* 动态指针数组 */
    p=s; /* "指针数组s"和"指向指针的指针变量p" 是兼容的,因为他们都指向指针变量的地址,即指向的对象大小是一致的 */

    printf ("字符串个数:%d\n",m+1);
    while (i<=m)
    {
        s[ i ]=array[ i ];  /* array 与 s不兼容,但array[0]与s[0]是兼容的,因为它们指向的对象大小是一致的*/
        /* 指针数组s保证了每个元素的值与array元素值是相同的.虽然他们元素本身地址不同 */

        printf ("字符串[%d]:%s\n",i,p[ i ]);  /* 指向指针的指针变量p保证了他的值,与s的值(即元素的地址)相同 */
        ++i;
    }

    return 0;
}

array[20][20] 模拟输入缓冲区,* s[m]模拟缓冲区数据结构(字符串),m和**p 模拟main 形参

论坛徽章:
0
4 [报告]
发表于 2012-04-15 22:10 |只看该作者
本帖最后由 家住马戏团 于 2012-04-15 22:12 编辑

exec函数族负责创建进程,exec函数中有传递给main函数的argv的参数。应该是由操作系统截获的命令行参数,利用exec创建进程,用一个可执行映像(就是*.exe)初始化该进程时,通过exec函数传递给main函数的
至于指向指针的指针(用int** p表示)和指针数组(用int* q[10]为例),p是一个左值,类型是int**,32位系统中占据四个字节的存储空间,存储着*p变量(int*型)的地址
q是一个右值(也有说是不可变的左值),它是一个以4个字节划分的40个字节的内存的首地址,是一个类似0xFFFFFFFF的值,进程的内存空间中没有存储该值的地址,编译时直接将该名称转换为了对应的地址。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP