C语言 你能简单地重新分配一个新的字符串指针没有任何问题吗?



我参考了IBM网站上提供的关于Strtok使用的示例代码,但是Strtok的功能并不是我主要关心的。

我担心的是在循环中重用char指针或字符串,特别是名为"token"的字符串变量。在下面的代码中

我已经读了很多文章,但是没有一篇文章用"白纸黑字"来回答我这个问题。

我想澄清一下,C语言是否允许像这样重复使用字符或字符串数组指针变量,以避免危险的编码。

可以看到,变量"token"在循环中一遍又一遍地重复使用,并且每次指针所表示的内容都被更改,并每次使用不同大小的字符串重新分配-这当然是生成的令牌。

可以这样使用指针吗?

#include <stdio.h>
#include <string.h>

int main(void)
{
char *token, *string = "a string, of, ,tokens,after null terminator";

/* the string pointed to by string is broken up into the tokens
"a string", " of", " ", and "tokens" ; the null terminator ()
is encountered and execution stops after the token "tokens"     */
token = strtok(string, ",");
do
{
printf("token: %sn", token);
}
while (token = strtok(NULL, ","));
}

/*****************  Output should be similar to:  *****************

token: a string
token:  of
token:
token: tokens
*/

虽然这是一个例子,我的主要项目,我试图写,需要某种类型的字符串变量,为了存储和处理字符串,这将是来自电信调制解调器传入的命令。像这样的命令每次的长度都是可变的,变量将被命名为"incoming_received_SMS_message",这将在循环中使用,以便其余代码确定命令并运行适当的函数。

所以,而不是使用malloc, memset或去远与一些建议的东西,你可以简单地只是重新分配一个新的字符串指针没有任何问题?(顺便说一下,我完全知道指针只包含一个地址)。

编辑:

所以我在Arduino IDE中尝试了这个代码来测试理论,但它仍然产生错误;

char * pointer;
void setup() {
Serial.begin(115200);
}
void loop() {
pointer = "sample text";
pointer = "even more sample text";
Serial.println(pointer);
}

但是这会产生以下错误;

警告:ISO c++禁止将字符串常量转换为'char*' [-Wwrite-strings]指针= "样本文本";

警告:ISO c++禁止将字符串常量转换为'char*' [-Wwrite-strings]指针= "更多示例文本"

对于初学者来说,所提供的代码具有未定义的行为,因为函数strtok试图更改字符串文字

char *token, *string = "a string, of, ,tokens,after null terminator";
token = strtok(string, ",");

任何改变字符串字面值的尝试都会导致未定义的行为。

似乎你指的是由字符串字面值初始化的字符数组,而不是指向字符串字面值本身的指针

char *token, string[] = "a string, of, ,tokens,after null terminator";
token = strtok(string, ",");

指针可以被重新赋值为任何非常量变量。例如,你可以写

int x = 0;
x = 10;
x = 20;

就像你可以重新分配一个指针,比如

char *s = "Hello";
s = "World!";
s = "Bye!";

或者另一个例子

char s[] = "Hello";
char *p;
for ( size_t i = 0; s[i] != ''; i++ )
{
p = s + i;
putchar( *p );
}
putchar( 'n' );

注意,如果一个指针指向一个不存在的对象,那么该指针将是无效的,取消引用这样的指针会调用未定义的行为。例如

char *p;
{
char s[] = "Hello";
p = s;
}
puts( p ); // undefined behavior!

最新更新