参考文章: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;}