首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得char * (char数组)的实际长度和总长度?

如何获得char * (char数组)的实际长度和总长度?
EN

Stack Overflow用户
提问于 2014-01-09 14:15:20
回答 14查看 339.1K关注 0票数 72

对于一个char [],我可以很容易地通过以下方法获得它的长度:

代码语言:javascript
复制
char a[] = "aaaaa";
int length = sizeof(a)/sizeof(char); // length=6

但是,我不能这样做来获得char *的长度:

代码语言:javascript
复制
char *a = new char[10];
int length = sizeof(a)/sizeof(char);

因为,我知道,这里的a是一个指针,所以这里的length总是4 (或者不同系统中的其他东西)。

我的问题是,之后我如何才能得到char *的长度?我知道有人会向我挑战,说你已经知道它的10了,因为你刚刚创建了它。我想知道这一点,因为这一步得到它的长度可能要走很长的路,从它的创建,我不想走很长的路回来,以检查这个数字。此外,我也想知道它的真正长度。

更具体地说

  • 我怎样才能得到它真正的length=5
  • 我怎样才能得到它的总length=10

对于以下示例:

代码语言:javascript
复制
char *a = new char[10]; 
strcpy(a, "hello");
EN

回答 14

Stack Overflow用户

回答已采纳

发布于 2014-01-09 14:22:58

你不能。至少不能百分之百准确。指针没有长度/大小,只有自己的。它所做的就是指向记忆中的某个特定位置,其中包含一个字符。如果该字符是字符串的一部分,那么您可以使用strlen来确定当前指向的字符后面的字符,但这并不意味着在您的情况下数组是那么大。

基本上:

指针不是数组,因此它不需要知道数组的大小。指针可以指向单个值,因此指针可以在没有数组的情况下存在。它甚至不关心它指向的内存位于何处(只读、堆或堆栈.不重要)。指针本身不具有其他长度。指针就是..。

考虑到这一点:

代码语言:javascript
复制
char beep = '\a';
void alert_user(const char *msg, char *signal); //for some reason
alert_user("Hear my super-awsome noise!", &beep); //passing pointer to single char!

void alert_user(const char *msg, char *signal)
{
    printf("%s%c\n", msg, *signal);
}

指针可以是单个字符,也可以是数组的开始、结束或中间.

把chars看作是结构。有时在堆上分配一个结构。这也会创建一个没有数组的指针。

仅使用指针,就无法确定它所指向的数组有多大。最接近它的方法是使用calloc并计算通过指针可以找到的连续\0字符的数量。当然,一旦您给数组的键分配了/重新分配的东西,这就不起作用了,而且如果刚好在数组外的内存也持有\0,它也会失败。因此,使用这种方法是不可靠的,危险的,只是一般的愚蠢。别这样做。它。

另一个类推:

把指针想象成一个路标,它指向X镇。这个标志不知道那个城镇是什么样子,它也不知道、也不关心(或关心)住在那里的人。它的工作是告诉你在哪里找到X镇,它只能告诉你这个城镇有多远,但不能告诉你它有多大。这些信息被认为与路标无关。这是你只能从城镇本身就能发现的东西,而不是指示你方向的路标。

因此,使用指针可以做的唯一一件事是:

代码语言:javascript
复制
char a_str[] = "hello";//{h,e,l,l,o,\0}
char *arr_ptr = &a_str[0];
printf("Get length of string -> %d\n", strlen(arr_ptr));

但是,当然,这只在数组/字符串以\0结尾的情况下才能工作。

作为旁白:

代码语言:javascript
复制
int length = sizeof(a)/sizeof(char);//sizeof char is guaranteed 1, so sizeof(a) is enough

实际上是将size_t (sizeof的返回类型)分配给int,最好是:

代码语言:javascript
复制
size_t length = sizeof(a)/sizeof(*a);//best use ptr's type -> good habit

由于size_t是一个无符号类型,如果sizeof返回更大的值,那么length的值可能是您没有想到的.

票数 67
EN

Stack Overflow用户

发布于 2014-01-09 14:17:26

如果char *以0结尾,则可以使用strlen

否则,就无法确定该信息。

票数 19
EN

Stack Overflow用户

发布于 2014-01-09 14:21:33

只有两种方式:

  • 如果char *指向的内存指针表示一个C字符串(也就是说,它包含有一个0字节来标记其结束的字符),则可以使用strlen(a)
  • 否则,您需要将长度存储在某个地方。实际上,指针只指向一个char。但是我们可以把它当作指向数组的第一个元素。由于不知道该数组的“长度”,所以需要将该信息存储在某个地方。
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21022644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档