【问题标题】:string literal and pointer usage in calculating length of string计算字符串长度时的字符串文字和指针用法
【发布时间】:2014-05-20 03:13:53
【问题描述】:

下面的代码与计算字符串的长度有关

#include <stdio.h>

int strl (char *s);
main ()
{
  int len1 = str ("hah");
  printf ("%d", len1);
}


int
str (char *s)
{
  int length = 0;
  while (*s != '\0')
    {
      length++;
      s++;
    }

  return (length);
}

当我调用函数str 时,我将字符串文字分配给指针,而不是将字符串文字的地址分配给指针,但事实证明该地址已存储。指针如何在不指定地址的情况下存储“hah”的地址?

【问题讨论】:

  • 你的问题是?
  • 我们使用 sum &command 将字符串的地址指向指针
  • 怎么把“hah”这个地址赋值给指针了
  • 在为参数分配参数时,我们所做的 s="hah"(s 是一个指针)如何存储“hah”的基地址
  • 我已经为您格式化了您的代码,并修正了一些语法,包括将最后一句话变成一个问题。但是,我仍然不确定您在问什么。

标签: c string-literals string-length


【解决方案1】:

你不需要指定它的地址,首先——你输入了str("hah");而不是strl("hah");(你写函数的时候也是这样)——字符串文字实际上算作变量函数的堆栈内存和内存分配给它。更重要的是,以这种方式指定字符串文字时:

char* str = "hah";
char* sstr = "hah";

打印时:

printf("%d %d", str, sstr);

你会得到相同的号码。使用字符串文字 - 编译器在内存中搜索相同的字符串,如果它不存在 - 它正在为其分配内存。在这种情况下 - 有一个相同的字符串,因此指针指向的地址将相同。 正确的程序应该是这样的:

#include <stdio.h>
int strl(char *s);
int main()
{ 
    int len1=strl("hah");
    printf("%d",len1);

    return 0;
}
int strl(char *s)
{
    int length=0;
    while (*s!='\0')
    {
        length++;
        s++;
    }

    return (length);
}

只是将 str 更改为 strl,因为您将 str 误认为 strl 或相反:P

【讨论】:

  • (strl 和 str) 搞错了我的 abd!
  • 正如您所说,字符串文字被视为变量。即使在变量的情况下[假设 i 将其分配给指针 *p=&i ]
  • 我们使用 & 运算符,我们在将字符串文字分配给指针时使用它
【解决方案2】:

"hah" 属于 type char[],因此当您将其传递给函数时,它会衰减为指向其第一个元素的指针,就像任何其他数组一样。

【讨论】:

  • 它不是任何其他数组,它是字符串文字,不能像数组一样编辑
  • 衰减指向它的第一个元素?没有任何操作员怎么会这样做
  • 因为数组的名称是它的第一个元素的地址 => arr == &amp;arr[0] 总是正确的。 “字符串文字且无法编辑”与数组名称是其第一个元素的地址这一事实无关
  • 在没有任何操作员的情况下如何做到这一点?这是一种语言设计选择,需要实现以这种方式运行。
  • 顺便说一下,想想我们这里有什么样的选择?要按原样传递数组,按值传递?我认为C 设计时非常昂贵。
猜你喜欢
  • 1970-01-01
  • 2019-04-20
  • 2015-02-22
  • 2010-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多