我有一个结构,我想通过一些回调函数传递给一些外部c代码,他们在我的程序中注册.但是,我想将该结构作为只读方式传递.我担心的是他们仍然可以修改我在我传递的原始结构中指向的结构.用下面的小例子解释:
struct s1 {
int a;
int b;
};
struct s2 {
int x;
struct s1 *y;
};
void f(const struct s2 *o)
{
//o->x=10; //error
o->y->a=20; //no error
o->y->b=30; //no error
}
int main()
{
struct s1 o1 = {10, 20};
struct s2 o2 = {30, &o1};
f(&o2);
}
Run Code Online (Sandbox Code Playgroud)
那么,我如何改进我的代码设计,以便他们不能修改我通过的结构?
如果我动态分配2D数组(malloc it),
int r,c;
scanf("%d%d",&r,&c);
int **arr = (int **)malloc(r * sizeof(int *));
for (i=0; i<r; i++)
arr[i] = (int *)malloc(c * sizeof(int));
Run Code Online (Sandbox Code Playgroud)
然后将它传递给一个函数,其原型是:
fun(int **arr,int r,int c)
Run Code Online (Sandbox Code Playgroud)
没有问题.但是当我声明像VLA这样的2D数组时
int r,c;
scanf("%d%d",&r,&c);
int arr2[r][c];
Run Code Online (Sandbox Code Playgroud)
当我尝试将它传递给同一个函数时,它给了我一个错误.为什么会这样?有没有什么方法可以将第二个2D数组(arr2)传递给函数?
我知道有很多类似的问题,但我找不到解决同一问题的问题.
我在c中随机地使用argc和argv进行了实验,但是这个程序(try.c):
/* Trying to understand argc and argv.*/
#include<stdio.h>
int main(int argc,char *argv[])
{
int i=0;
/*
argv[4]="arg4";
argv[5]="arg5";
argv[6]="arg6";
argv[7]="arg7";
argv[8]="arg8";
argv[9]="arg9";;
*/
for(i=0;i<(argc+20);i++)
{
printf("arg %d: %s\n", i,argv[i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当运行时
./try arg1 arg2 arg3
Run Code Online (Sandbox Code Playgroud)
打印出来:
arg 0: ./try
arg 1: arg1
arg 2: arg2
arg 3: arg3
arg 4: (null)
arg 5: XDG_VTNR=7
arg 6: XDG_SESSION_ID=c2
arg 7: CLUTTER_IM_MODULE=xim
arg 8: SELINUX_INIT=YES
arg 9: XDG_GREETER_DATA_DIR=/var/lib/lightdm-data/raman
arg 10: GPG_AGENT_INFO=/run/user/1000/keyring-FAajwI/gpg:0:1
arg 11: TERM=xterm
arg 12: SHELL=/bin/bash
arg …
Run Code Online (Sandbox Code Playgroud) 我来自C/C++背景,对java很新,我很难理解java中的变量声明和内存分配.
我们写的时候
myclass myobject;
Run Code Online (Sandbox Code Playgroud)
我们声明myobject是myclass类型的变量.我们没有为它分配内存.
int a;
Run Code Online (Sandbox Code Playgroud)
它声明变量a并且还在堆栈中分配等于int大小的内存.
是这样的吗?编译器是为原始数据类型分配内存,而不是为非原始数据类型分配内存?
我在这里提出了类似的疑问.
以下是关于c ++ std :: string的一些我无法理解的案例.
1.
string ans = ""+'a';
cout << ans << endl; //Prints _string::copy
Run Code Online (Sandbox Code Playgroud)
2.
string ans="";
ans=ans+'a';
cout << ans << endl; //Prints a
Run Code Online (Sandbox Code Playgroud)
3.
string ans="";
ans = ans + (5 + '0'); // Throws error
Run Code Online (Sandbox Code Playgroud)
4.
string ans="";
ans += (5 + '0'); //works
Run Code Online (Sandbox Code Playgroud)
5.
在代码中,我的行
ans += to_string(q);
q是单个数字整数.该程序引发了运行时错误.
将其更改为ans+= (q+'0');
并删除了错误.
请帮助清除这个想法.
我有以下代码:
#include<stdio.h>
#include<unistd.h>
int main()
{
int a=0;
printf("before: %d %p\n",a,&a);
int t=fork();
if(t==0)
{
a=a+5;
printf("child: %d %p\n",a,&a);
}
else
{
a=a+10;
printf("parent: %d %p\n",a,&a);
}
//printf("both: %d %p\n",a,&a);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
为什么所有地址都打印相同?我想在调用fork时会创建一个新的变量副本.它与虚拟地址和物理地址有什么关系吗?如果是这样,相同的虚拟地址如何映射到不同的物理地址?
char a_1[512];
int some_variable;
char a_2[512];
main()
{
...
}
Run Code Online (Sandbox Code Playgroud)
在上面的程序中,我已经声明了一些变量,都在代码的bss部分.考虑到我已经记住了对齐问题,我可以确定为这3个变量分配的内存总是连续的吗?