her*_*tao 39 c c++ arrays char
对于a char [],我可以很容易地得到它的长度:
char a[] = "aaaaa";
int length = sizeof(a)/sizeof(char); // length=6
Run Code Online (Sandbox Code Playgroud)
但是,我不能这样做以获得a的长度char *:
char *a = new char[10];
int length = sizeof(a)/sizeof(char);
Run Code Online (Sandbox Code Playgroud)
因为,我知道,a这里是一个指针,所以length这里将永远是4(或不同系统中的其他东西).
我的问题是,如何才能获得char *事后的长度?我知道有人可能会挑战我你已经知道它,10因为你刚刚创造了它.我想知道这一点,因为这个获得它的长度的步骤可能会从它的创建中走很长一段路,而且我不想长时间回来检查这个数字.而且,我也想知道它的实际长度.
更具体
length=5?length=10?对于以下示例:
char *a = new char[10];
strcpy(a, "hello");
Run Code Online (Sandbox Code Playgroud)
Eli*_*gem 43
你不能.无论如何,不是100%准确.指针没有长度/大小但是它自己的长度/大小.它所做的只是指向内存中包含char的特定位置.如果该字符串是字符串的一部分,那么您可以使用它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);
}
Run Code Online (Sandbox Code Playgroud)
指针可以是单个char以及数组的开头,结尾或中间...
将字符视为结构.有时您在堆上分配一个结构.这也创建了一个没有数组的指针.
仅使用指针来确定它指向的数组有多大是不可能的.你可以得到的最接近的是使用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));
Run Code Online (Sandbox Code Playgroud)
但是,这当然只有在数组/字符串是\ 0终止时才有效.
作为一个助手:
int length = sizeof(a)/sizeof(char);//sizeof char is guaranteed 1, so sizeof(a) is enough
Run Code Online (Sandbox Code Playgroud)
实际上是将size_t(返回类型sizeof)分配给int最佳写入:
size_t length = sizeof(a)/sizeof(*a);//best use ptr's type -> good habit
Run Code Online (Sandbox Code Playgroud)
既然size_t是无符号类型,如果sizeof返回更大的值,那么值length可能是你没想到的......
Olo*_*iar 14
如果char *是0终止,则可以使用strlen
否则,无法确定该信息
只有两种方式:
如果您指向的内存指针char *表示一个 C 字符串(即,它包含以 0 字节标记其结尾的字符),您可以使用strlen(a).
否则,您需要将长度存储在某处。实际上,指针只指向1 char。但是我们可以把它当作指向数组的第一个元素来对待。由于该数组的“长度”未知,因此您需要将该信息存储在某处。