【问题标题】:Why the sizeof a string is different in main and in a function? [duplicate]为什么 main 和函数中字符串的大小不同? [复制]
【发布时间】:2017-01-18 00:21:02
【问题描述】:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int foo(char str[])
{
    char *str1=(char *)malloc(sizeof(char )*sizeof(str));

    printf("\n str %s  size : %zu  \n",str,sizeof(str));    
}

int main()
{
    char str[]="879879879-=-=-@#$@#$abcd";
    printf("\n str %s  size : %zu  \n",str,sizeof(str));

    foo(str);
    return 0;
}

为什么main()foo() 的字符串长度不同? 这是一个简单的程序,其中mainstr 调用foo — 相同的strmain 中显示长度为25 在foo 8:为什么?

输出:

str 879879879-=-=-@#$@#$abcd  size : 25  
str 879879879-=-=-@#$@#$abcd  size : 8 

【问题讨论】:

  • 在函数中,char str[] 等价于char *str,并且指针的大小小于您正在播放的特定字符串的大小。在主函数中,str 是一个数组,sizeof 报告数组的大小,包括终端空字节,这意味着sizeof(str) == strlen(str) + 1 — 在main() 内。 (请注意,您在foo() 中泄漏了内存。)
  • 可能会有所帮助:c-faq.com/aryptr/index.html

标签: c string


【解决方案1】:

在这个函数声明中

int foo(char str[]);

将声明为数组的参数调整为char *类型的指针。

因此这些函数声明

int foo(char str[1000]);
int foo(char str[100]);
int foo(char str[1]);
int foo(char str[]);

声明同一个函数并等价于

int foo(char *str);

作为函数内的结果这个表达式

sizeof(str)

产生char * 类型指针的大小。

在 main 中确实声明了一个数组

char str[]="879879879-=-=-@#$@#$abcd";

这个表达式

sizeof(str)

产生数组的大小。

如果您想在函数中分配内存来存储保存在数组中的字符串,那么您应该使用标准字符串函数strlen 而不是运算符sizeof。例如

int foo(char str[])
{
    char *str1 = (char *)malloc( strlen( str ) + 1 );
    strcpy( str1, str );

    // ...
}

【讨论】:

    猜你喜欢
    • 2021-10-31
    • 2021-11-23
    • 1970-01-01
    相关资源
    最近更新 更多