user-0 提问: 关于库函数的一点疑问

回复:
user: user-0
content: 引用 11 楼 my_live_123 的回复: If an attempt is made to modify an object defined with a const-qualified type through use of an lvalue with non-const-qualified type, the behavior is undefined.  嗯嗯，就像http://blog.csdn.net/heyabo/article/details/8745942这里面讲的确实是未定义行为。和编译器相关吧。

user: user-0
content: 应该是这样的，由编译器自己按自己方式来处理。

user: user-1
content: 引用 12 楼 E_Herohawk 的回复:[quote=引用 11 楼 my_live_123 的回复:]  If an attempt is made to modify an object defined with a const-qualified type through use of an lvalue with non-const-qualified type, the behavior is undefined.  嗯嗯，就像http://blog.csdn.net/heyabo/article/details/8745942这里面讲的确实是未定义行为。和编译器相关吧。[/quote]   标准里说未定义，那意思就是交个编译器自己处理吧，想怎么处理就怎么处理

user: user-0
content: 引用 10 楼 u012436960 的回复:[quote=引用 9 楼 E_Herohawk 的回复:] 回一楼：在VC6.0下试了一下将const指针赋给非const指针，完了再操作确实可以。那会不会是strcpy这个库函数里有一个指针转换的过程。大侠说的“代码可以无视它”能说明白一点么，嘿嘿，有些不明白。 回二楼：嗯，const是修饰只读的，我们程序员不能对const修饰的变量赋值，但调用该库函数就可实现，其实我是想知道strcpy这个库函数的具体实现方法。通过一楼我有个猜想，会不会就像我回一楼的那样。 回六楼：你这个测试代码在VC6.0下编译通过无警告并运行正常。 回七楼：const修饰的变量不就放在只读存储区么，这不对么。  你可以看一下strcpy的声明：  char *strcpy(    char *strDestination,    const char *strSource  );  strDestination的类型是char*,而不是const char*,与我的代码类似，都是将类型为const type*的值传入参数类型为type*的函数,这种情况编译是可以通过的。[/quote] strcpy是将后一个参数传入的值赋给第一个参数，改变的是第一个的值，后一个没动，你的函数传入的参数是const型，但在函数f内部，参数值被改变。还是感谢大家的解答，这种问题吧，写程序的时候最好不要出现，一般都不会这么做，既然声明为const，那就是不希望改变其值了，我只是闲来没事试一下。

user: user-2
content: 引用 9 楼 E_Herohawk 的回复:回一楼：在VC6.0下试了一下将const指针赋给非const指针，完了再操作确实可以。那会不会是strcpy这个库函数里有一个指针转换的过程。大侠说的“代码可以无视它”能说明白一点么，嘿嘿，有些不明白。 回二楼：嗯，const是修饰只读的，我们程序员不能对const修饰的变量赋值，但调用该库函数就可实现，其实我是想知道strcpy这个库函数的具体实现方法。通过一楼我有个猜想，会不会就像我回一楼的那样。 回六楼：你这个测试代码在VC6.0下编译通过无警告并运行正常。 回七楼：const修饰的变量不就放在只读存储区么，这不对么。  你可以看一下strcpy的声明：  char *strcpy(    char *strDestination,    const char *strSource  );  strDestination的类型是char*,而不是const char*,与我的代码类似，都是将类型为const type*的值传入参数类型为type*的函数,这种情况编译是可以通过的。

user: user-0
content: 回一楼：在VC6.0下试了一下将const指针赋给非const指针，完了再操作确实可以。那会不会是strcpy这个库函数里有一个指针转换的过程。大侠说的“代码可以无视它”能说明白一点么，嘿嘿，有些不明白。 回二楼：嗯，const是修饰只读的，我们程序员不能对const修饰的变量赋值，但调用该库函数就可实现，其实我是想知道strcpy这个库函数的具体实现方法。通过一楼我有个猜想，会不会就像我回一楼的那样。 回六楼：你这个测试代码在VC6.0下编译通过无警告并运行正常。 回七楼：const修饰的变量不就放在只读存储区么，这不对么。

user: user-1
content: If an attempt is made to modify an object defined with a const-qualified type through use of an lvalue with non-const-qualified type, the behavior is undefined.

user: user-3
content: 没有不能修改的内存，const只是在编译时的一个标记

user: user-4
content: 编译器内部的实现

user: user-5
content: const 只是在编译时做检查的，运行时你直接修改的是内存，除非你的const变量存放的内存区域在只读存储区（实际就是代码区）

user: user-2
content: #include<stdio.h> void f(int *n) {     if(n)*n=6; } int main() {     const int a=3;     printf("%d\n",a);     f(&a);     printf("%d\n",a);     return 0; }  楼主可以试一下，通常会有个warning。

user: user-6
content: 不要纠结各种常量了，这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢！

user: user-7
content: 编译器的锅~

user: user-8
content: 首先字符串数组的赋值只能在初始化数组时 进行赋值， 之后是不能直接赋值的， 要想赋值只能使用库函数strcpy， memcpy等来进行赋值， 这跟const没有关系， const在C中修饰的 变量 表示不可修改的， 也是个变量，在C++中是产量，  列如：  Int  const *a = 1；         int * const b = 1；                 a++；               b++；错误          *a++；错误           *b++；

user: user-9
content: C\C++里面，const指针是可以强制转换成非const指针的，不是吗？ const修饰符只是让编译器检查用的，代码完全可以无视它。总之，没有不能修改的内存。