所以我正在开发一个非常大的代码库,最近升级到gcc 4.3,它现在触发了这个警告:
警告:不推荐将字符串常量转换为'char*'
显然,解决这个问题的正确方法是找到每个声明
char *s = "constant string";
Run Code Online (Sandbox Code Playgroud)
或函数调用如:
void foo(char *s);
foo("constant string");
Run Code Online (Sandbox Code Playgroud)
并使他们成为const char指针.但是,这意味着触及564个文件,最小,这不是我希望在此时执行的任务.现在的问题是我正在运行-werror,所以我需要一些方法来扼杀这些警告.我怎样才能做到这一点?
const int a = 10
int *p = (int*) &a;
*p = 20;
printf("a = %d", a);
Run Code Online (Sandbox Code Playgroud)
是否可以输出10或20,具体取决于编译器?
const变量在哪里准确存储,它的行为如何变化?比如说:
const int i=10; // stores where ?
main()
{
const int j=20; //stores where?
return 0;
}
Run Code Online (Sandbox Code Playgroud)
如果答案是代码段,那么以下代码如何工作?
main()
{
const int j=20;
int *p;
p=&j;
(*p)++;
return 0 ;
}
Run Code Online (Sandbox Code Playgroud)
这段代码工作正常......如何更改只读内存?它是如何真正存储的?请详细解释一下.
我试图了解我应该如何const在C代码中使用.首先,我并没有真正使用它,但后来我看到了很多const在整个过程中使用的例子.我应该努力并回去并虔诚地制作合适的变量const吗?或者我只是在等我的时间?
我想它可以更容易地读取预期会发生变化的变量,特别是在函数调用中,对于人类和编译器.我错过了其他重要的观点吗?
该const类型限定符使编译器的情况下发出一个错误消息试图修改声明为一个对象const,但这是不够的protection.For例如以下程序修改声明为所述阵列的两个元件const:
#include <stdio.h>
int main(void)
{
const char buf[2] = { 'a','b' };
const char *const ptr = buf;
unsigned long addr = (unsigned long)ptr;
*(char *)addr = 'c';
addr = addr + 1;
*(char *)addr = 'd';
printf("%c\n", buf[0]);
printf("%c\n", buf[1]);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以,事实证明编译器没有足够的保护来保护对象不被修改.我们如何防止这种事情?
我能够const在gcc 中更改修改变量的值,但在其他编译器中却没有.我在gcc上尝试了这个代码,它更新了i和j(11)的值.使用在线编译器,我得到不同的值.
#include<stdio.h>
void main() {
const int i=10;
int *j;
j = &i;
(*j)++;
printf("address of j is %p address of i is %p\n",j,&i);
printf("i is %d and j is %d\n",i,*j);
}
Run Code Online (Sandbox Code Playgroud) 我想通过使用指针来改变常量的值.
请考虑以下代码
int main()
{
const int const_val = 10;
int *ptr_to_const = &const_val;
printf("Value of constant is %d",const_val);
*ptr_to_const = 20;
printf("Value of constant is %d",const_val);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,常量的值被修改.
但是当我尝试使用全局常量的相同代码时,我遇到了运行时错误.Windows崩溃记者正在开放.在此语句"*ptr_to_const = 20;"中打印第一个printf语句后,可执行文件暂停
请考虑以下代码
const int const_val = 10;
int main()
{
int *ptr_to_const = &const_val;
printf("Value of constant is %d",const_val);
*ptr_to_const = 20;
printf("Value of constant is %d",const_val);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
该程序使用codeblocks IDE在mingw环境中编译.
谁能解释一下发生了什么?
运行以下代码显示&x = ptr,那么x和*ptr怎么不相等?
const int x=10;
int* ptr =(int*) &x;
*ptr = (*ptr)+1;
cout << &x << " " << x << " " << ptr <<" " <<*ptr; //output : 0012FF60 10 0012FF60 11
Run Code Online (Sandbox Code Playgroud) 我在运行下面的代码时弄乱了指针和const:
int main()
{
const int test = 10;
int *ptr = &test;
printf("%d\n", test);
*ptr = 1;
printf("%d\n", test);
}
Run Code Online (Sandbox Code Playgroud)
在 Mac 上,结果为:
10
10
Run Code Online (Sandbox Code Playgroud)
在linux机器上:
10
1
Run Code Online (Sandbox Code Playgroud)
为什么更改值在 Mac 上不起作用?两台机器都使用 gcc 编译代码。