对于一个char [],我可以很容易地通过以下方法获得它的长度:
char a[] = "aaaaa";
int length = sizeof(a)/sizeof(char); // length=6但是,我不能这样做来获得char *的长度:
char *a = new char[10];
int length = sizeof(a)/sizeof(char);因为,我知道,这里的a是一个指针,所以这里的length总是4 (或者不同系统中的其他东西)。
我的问题是,之后我如何才能得到char *的长度?我知道有人会向我挑战,说你已经知道它的10了,因为你刚刚创建了它。我想知道这一点,因为这一步得到它的长度可能要走很长的路,从它的创建,我不想走很长的路回来,以检查这个数字。此外,我也想知道它的真正长度。
更具体地说
length=5length=10对于以下示例:
char *a = new char[10];
strcpy(a, "hello");发布于 2014-01-09 14:22:58
你不能。至少不能百分之百准确。指针没有长度/大小,只有自己的。它所做的就是指向记忆中的某个特定位置,其中包含一个字符。如果该字符是字符串的一部分,那么您可以使用strlen来确定当前指向的字符后面的字符,但这并不意味着在您的情况下数组是那么大。
基本上:
指针不是数组,因此它不需要知道数组的大小。指针可以指向单个值,因此指针可以在没有数组的情况下存在。它甚至不关心它指向的内存位于何处(只读、堆或堆栈.不重要)。指针本身不具有其他长度。指针就是..。
考虑到这一点:
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镇,它只能告诉你这个城镇有多远,但不能告诉你它有多大。这些信息被认为与路标无关。这是你只能从城镇本身就能发现的东西,而不是指示你方向的路标。
因此,使用指针可以做的唯一一件事是:
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结尾的情况下才能工作。
作为旁白:
int length = sizeof(a)/sizeof(char);//sizeof char is guaranteed 1, so sizeof(a) is enough实际上是将size_t (sizeof的返回类型)分配给int,最好是:
size_t length = sizeof(a)/sizeof(*a);//best use ptr's type -> good habit由于size_t是一个无符号类型,如果sizeof返回更大的值,那么length的值可能是您没有想到的.
发布于 2014-01-09 14:17:26
如果char *以0结尾,则可以使用strlen。
否则,就无法确定该信息。
发布于 2014-01-09 14:21:33
只有两种方式:
char *指向的内存指针表示一个C字符串(也就是说,它包含有一个0字节来标记其结束的字符),则可以使用strlen(a)。char。但是我们可以把它当作指向数组的第一个元素。由于不知道该数组的“长度”,所以需要将该信息存储在某个地方。https://stackoverflow.com/questions/21022644
复制相似问题