小编San*_*ngh的帖子

位移是否取决于字节序?

假设我有'numb'=1025 [00000000 00000000 00000100 00000001]代表的数字:

在Little-Endian机器上:

00000001 00000100 00000000 00000000
Run Code Online (Sandbox Code Playgroud)

在Big-Endian机器上:

00000000 00000000 00000100 00000001
Run Code Online (Sandbox Code Playgroud)

现在,如果我在10位上应用Left Shift(即:numb << = 10),我应该:

[A]在Little-Endian机器上:

正如我在GDB中注意到的那样,Little Endian通过3个步骤执行左移:[我已经显示'3'步骤以更好地理解处理]

  1. 对待没有.在Big-Endian公约中:

    00000000        00000000        00000100    00000001
    
    Run Code Online (Sandbox Code Playgroud)
  2. 应用左移:

    00000000        00010000        00000100        00000000
    
    Run Code Online (Sandbox Code Playgroud)
  3. 再次在Little-Endian中表示结果:

    00000000        00000100        00010000        00000000 
    
    Run Code Online (Sandbox Code Playgroud)

[B].在Big-Endian机器上:

00000000        00010000        00000100        00000000
Run Code Online (Sandbox Code Playgroud)

我的问题是:

如果我直接在Little Endian公约上应用左移,它应该给:

numb:

00000001 00000100 00000000 00000000
Run Code Online (Sandbox Code Playgroud)

numb << 10:

00010000 00000000 00000000 00000000
Run Code Online (Sandbox Code Playgroud)

但实际上,它给出了:

00000000        00000100        00010000        00000000 
Run Code Online (Sandbox Code Playgroud)

为了达到第二个结果,我在上面展示了三个假设步骤.

请解释一下为什么上述两个结果不同:实际结果numb << 10与预期结果不同.

c endianness

146
推荐指数
5
解决办法
3万
查看次数

如何创建socket类型的特殊文件?

我需要为kgdb-gdb远程连接创建串口套接字.

就像mkfifo在系统上创建FIFO一样,我们如何创建套接字文件?

unix gdb

26
推荐指数
1
解决办法
4万
查看次数

是否可以找到分配给指针的内存,而无需搜索malloc语句

假设我已经为函数中的某个指针分配了内存foo:

void foo()
{    
    // ...  
    int *ptr = malloc(20*sizeof(int));  

    bar (ptr);
}  
Run Code Online (Sandbox Code Playgroud)

foo(),我将这个指针传递给另一个函数bar(),让我们说bar().

现在,在某个时间点,我想检查:指针分配了多少内存.

有没有可能的方法,没有搜索声明:

int *ptr = malloc(20*sizeof(int)); 
Run Code Online (Sandbox Code Playgroud)

使用GDB计算出为指针分配了多少内存?

谢谢.

c gdb

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

清晰可视化C程序的内存布局的工具

假设我有这个代码:

int main() {
    int var1;  
    char *ptr = malloc(5 * sizeof(char));  
    //...........  
    do_something();  
    //...........    
    return 0;  
}
Run Code Online (Sandbox Code Playgroud)

我们知道,实际的内存布局将分为领域,如:.text,.bss,.data,.heap,.stack.

我知道如何使用objdump,readelf等等.但是,我希望更好地了解内存堆栈,我可以看到以下内容:

.heap       ptr  
.stack      do_something()  
.text       main()  
.bss        var1  
Run Code Online (Sandbox Code Playgroud)

主要的一点是:实际变量名是从输出丢失objdump,readelf等等.

我正在编译此代码-g,从而保留符号表.

那么,为什么我无法看到包含本地/全局变量名的内存布局?

objdump -x如果static不是类型,则显示变量的名称.为什么?

c memory debug-symbols

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

我们可以验证是否已定义typedef

假设我的程序是:

typedef int MYINT;

int main()  
{  
    MYINT x = 5;  
    ........  
    do_something()    
    ........    
    /* I wanna test whether MYINT is defined or not */
    /* I can't use: ifdef (MYINT), since MYINT is not a macro */

    ........
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

实际上,我在使用vxworks的交叉编译器时遇到了这个问题.交叉编译头文件包括:typedef int INT.

但是,我的堆栈头文件使用:

 #ifndef INT  
 #define int INT
Run Code Online (Sandbox Code Playgroud)

您能否建议如何测试typedef,无论它们是否先前已定义过?

提前致谢.

c

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

如何解决:C代码中"从不同大小的整数转换为指针"警告?

我正在从遗留代码中删除gcc警告.

是否可以通过类型转换来抑制警告"从不同大小的整数转换为指针":

example:

some_struct *ptr = func()  // func() returns an integer.
Run Code Online (Sandbox Code Playgroud)

有人可以指导我如何解决这样的gcc警告?

c pointers gcc-warning

10
推荐指数
2
解决办法
7万
查看次数

双指针实现二维数组实现

请考虑以下代码:

#include <stdio.h>
#include <stdlib.h>

#define NUM_ARRAYS     4
#define NUM_ELEMENTS   4
#define INVALID_VAL   -1

int main()
{
   int index            = INVALID_VAL;
   int array_index      = INVALID_VAL;
   int **ptr            = NULL;

   ptr = malloc(sizeof(int*)*NUM_ARRAYS);

   if (!ptr)
   {
      printf ("\nMemory Allocation Failure !\n\n");
      exit (EXIT_FAILURE);
   }

   for (index=0; index<NUM_ARRAYS; index++)
   {
      *(ptr+index) = malloc(sizeof(int)*NUM_ELEMENTS); 

      if (!*(ptr+index))
      {
         printf ("\nMemory Allocation Failure !\n");
         exit (EXIT_FAILURE);
      }
   }

   /* Fill Elements Into This 2-D Array */
   for (index=0; index<NUM_ARRAYS; index++)
   {
      for (array_index = 0; …
Run Code Online (Sandbox Code Playgroud)

c double-pointer multidimensional-array

8
推荐指数
2
解决办法
5万
查看次数

无法进入系统调用源代码

我用-g选项编译了我的freebsd libc源代码,现在我可以介入libc函数了.

但我无法进入系统调用代码.我用-g编译了freebsd内核源代码.在设置断点时,gdb会在.S文件上通知断点.在点击断点时,gdb无法进入系统调用源代码.

另外,我试过:gdb $ catch系统调用打开

但这也行不通.

你能建议一下吗?

谢谢.

unix gdb systems-programming

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

ltrace和strace工具中的行号信息

我是否可以查看行号和文件名(对于我使用ltrace/strace运行的程序)以及库调用/系统调用信息.

例如:

code section :: ptr = malloc(sizeof(int)*5); (file:code.c, line:21)
Run Code Online (Sandbox Code Playgroud)

ltrace或任何其他工具: malloc(20) :: code.c::21

我已经尝试了ltrace/strace的所有选项,但无法找到获取此信息的方法.

如果不能通过ltrace/strace实现,我们是否有GNU/Linux的任何并行工具选项?

c re-engineering strace ltrace

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

如何在 GDB 中停止在函数末尾(而不退出)?

请考虑以下代码:

main()
{
    ....
    retval = func();
}
Run Code Online (Sandbox Code Playgroud)

假设我在给定函数上放置了一个断点:

gdb$ b func
Run Code Online (Sandbox Code Playgroud)

现在,这个断点被击中并且我在函数 func() 中“完成”:

gdb$ fin
Run Code Online (Sandbox Code Playgroud)

我的问题是:

执行“完成”让我回到 main(),在这里:

retval = func();
Run Code Online (Sandbox Code Playgroud)

我想在 func() 的末尾停止而不退出 func()。

有人可以建议一些通用方法(独立于 func() 中的代码行数)来实现这一目标吗?

谢谢。

gdb

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