小编Ram*_*man的帖子

指向const结构的指针,仍然可以修改成员吗?

我有一个结构,我想通过一些回调函数传递给一些外部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)

那么,我如何改进我的代码设计,以便他们不能修改我通过的结构?

c

16
推荐指数
3
解决办法
1556
查看次数

将可变长度的2D数组传递给函数

如果我动态分配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 arrays function

3
推荐指数
1
解决办法
160
查看次数

信号、异常、硬件中断、陷阱

我读了这个答案,我想我有了一个清晰的想法。但这个答案又让我困惑了。

有人可以给我一个清晰的图片来说明信号、异常、硬件中断和陷阱之间的区别吗?

另外,我想知道这些块CPU抢占的内核代码中有哪些?

例子会很有帮助。

linux cpu kernel interrupt

3
推荐指数
1
解决办法
4118
查看次数

argv打印出环境变量

我在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 linux

2
推荐指数
1
解决办法
1723
查看次数

JVM在原始类型的声明中分配内存,但不为非原始类型分配内存?

我来自C/C++背景,对java很新,我很难理解java中的变量声明和内存分配.

我们写的时候

myclass myobject;
Run Code Online (Sandbox Code Playgroud)

我们声明myobject是myclass类型的变量.我们没有为它分配内存.

int a;
Run Code Online (Sandbox Code Playgroud)

它声明变量a并且还在堆栈中分配等于int大小的内存.

是这样的吗?编译器是为原始数据类型分配内存,而不是为非原始数据类型分配内存?

我在这里提出了类似的疑问.

java

2
推荐指数
1
解决办法
6150
查看次数

C++字符串联与std :: string行为.请解释一下

以下是关于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');并删除了错误.

请帮助清除这个想法.

c++ string

2
推荐指数
2
解决办法
590
查看次数

使用fork创建的新进程,但为变量打印相同的地址

我有以下代码:

#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时会创建一个新的变量副本.它与虚拟地址和物理地址有什么关系吗?如果是这样,相同的虚拟地址如何映射到不同的物理地址?

c operating-system fork

1
推荐指数
1
解决办法
84
查看次数

同一部分的内存是否总是连续分配?

char a_1[512];
int some_variable;
char a_2[512];
main()
{
        ...
}
Run Code Online (Sandbox Code Playgroud)

在上面的程序中,我已经声明了一些变量,都在代码的bss部分.考虑到我已经记住了对齐问题,我可以确定为这3个变量分配的内存总是连续的吗?

c

0
推荐指数
1
解决办法
72
查看次数

标签 统计

c ×5

linux ×2

arrays ×1

c++ ×1

cpu ×1

fork ×1

function ×1

interrupt ×1

java ×1

kernel ×1

operating-system ×1

string ×1