c语言报错笔记:[Warning] deprecated conversion from string constant to ‘char*‘

参考文章:http://t.csdn.cn/cHkme

一、报错过程:

在学习b站鹏哥c语言指针初阶时(81. 【C语言初阶】指针和数组_哔哩哔哩_bilibili),跟着自己敲了一遍代码:

#include 

int my_strlen(char* string)
{
	char* start_position = string;
	while(*string != '\0')
	{
		string++;
	}
	
	return (string - start_position);
}

int main()
{
	printf("%d\n",my_strlen("aoba"));
	return 0;
}

我当时想着何必先要创建一个变量接收函数值,然后再将函数值打印呢。直接打印函数值不好吗? 

结果编译后发现报了个警告:

[Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings]

二、解决过程

参考了http://t.csdn.cn/cHkme这篇文章之后,发现问题出在这一句:

printf("%d\n",my_strlen("aoba"));

 这里my_strlen(char* string)本来应该接受一个指针变量的,结果这段代码中直接把一个字符串常量赋值进去了,因此报了警告。

那么这个警告是什么意思呢?参考上述文章:

char *背后的含义是:给我个字符串,我要修改它。

而理论上,我们传给函数的字面常量是没法被修改的。

所以说,比较和理的办法是把参数类型修改为const char *。

const char *背后的含义是:给我个字符串,我只要读取它。

但这样的方法在此处不适用,因为在my_strlen()函数中对string做了修改,使string的地址进行了++操作:

string++;

所以一种修改方式是先将字符串赋值给char型的数组变量,再将此数组传给my_strlen()函数就行了。因为此处的string就是地址,不会出现类型不匹配的错误。修改后的代码如下:

#include 

int my_strlen(char* string)
{
	char* start_position = string;
	while(*string != '\0')
	{
		string++;
	}
	
	return (string - start_position);
}

int main()
{
	char string[10] = "aoba";
	printf("%d\n",my_strlen(string));
	return 0;
}

 另一种修改方式是对常量字符串进行强制类型转换,转成(char*)类型,意思是告诉编译器不需要编译器来判断类型,我们清楚这样修改的后果是什么。这样也能保证实参和形参类型匹配。修改后的代码如下: 

#include 

int my_strlen(char* string)
{
	char* start_position = string;
	while(*string != '\0')
	{
		string++;
	}
	
	return (string - start_position);
}

int main()
{
	printf("%d\n",my_strlen((char*)"aoba"));
	return 0;
}

你可能感兴趣的:(c语言,笔记)