你做不到百分之百的准确性。指针只有自己的长度/大小,它只是指向内存中一个char的特定位置。如果该char是字符串的一部分,则可以使用strlen
确定当前指向的字符后面跟随的字符,但这并不意味着在你的情况下数组那么大。
基本上:
指针不是数组,因此它不需要知道数组的大小。指针可以指向单个值,因此即使没有数组,指针也可以存在。它甚至不关心它所指向的内存位于何处(只读、堆栈等都没关系)。指针除了自己的长度外,没有别的长度。指针只是存在…
考虑以下内容:
char beep = '\a';
void alert_user(const char *msg, char *signal);
alert_user("Hear my super-awsome noise!", &beep);
void alert_user(const char *msg, char *signal)
{
printf("%s%c\n", msg, *signal);
}
指针可以是单个字符,也可以是数组的开头、末尾或中间...
把字符看作结构体。有时你会在堆上分配一个单独的结构体。这也会创建一个不带数组的指针。
仅使用指针来确定它所指向的数组大小是不可能的。你能做到的最接近的方法是使用 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
实际上是将 sizeof
的返回类型 size_t
分配给一个 int
,最好写成:
size_t my_size = sizeof(my_var);
int my_int_size = static_cast<int>(my_size);
size_t length = sizeof(a)/sizeof(*a);//best use ptr's type -> good habit
由于 size_t
是一个无符号类型,如果 sizeof
返回更大的值,length
的值可能会超出你的预期...
strlen
函数是用来计算字符串长度的,它接受一个字符串作为参数并返回该字符串中字符的数量,不包括结尾的空字符。 - Kiril Kirovstd::vector<char>
,这样你就可以获取大小,并且内存管理已经为你完成。 - Jarod42new
;如果是C++,则应该使用更高级的抽象,如vector
来解决这个问题。 - Mike Seymour