【问题标题】:Pointer/Structure Issue C指针/结构问题 C
【发布时间】:2012-08-02 18:48:10
【问题描述】:

我有以下段错误的代码,我完全不知道为什么。任何帮助将不胜感激。

当我这样做时会发生段错误(检查是否所有内容都已正确初始化)。没有打印任何内容,因此它在第一行出现段错误。不幸的是,我无法使用 valgrind,因为此代码位于我无法访问的沙箱中,因此无法检查那里的问题。

for (i = 0 ; i<nb_read ; i++) {

 fprintf(stdout, "Read Lock i %d  %p \n ",i, nap->read_buffer[i]->sem_handle); 
 fprintf(stdout, "Write Lock i %d  %p \n ",i, nap->write_buffer[i]->sem_handle);  
 fprintf(stdout, "Read Buffer i %d  %p \n ",i, nap->read_buffer[i]->buffer); 
 fprintf(stdout, "Write Buffer i %d  %p \n ",i, nap->write_buffer[i]->buffer); 

}

其中 SharedStruct 是具有 char* 缓冲区成员和 int sem_handle 的结构

SharedStruct** create_buffer(int nb, int size) {
SharedStruct** result = malloc(nb * sizeof(SharedStruct*));
int i = 0 ;
for (i = 0 ; i<nb ; i++) {
        SharedStruct* res= malloc(nb *sizeof(SharedStruct));
        res->buffer = malloc(size * sizeof(char)); 
        int lock = initialise_protection();
        fprintf(stdout, "\n Semaphore initialised to %d \n ", lock);
        res->sem_handle = lock ;
    }
    return result ;
 }

【问题讨论】:

  • 你为什么不在自己的机器上编译它并在那里用valgrind测试呢?
  • 另外,nap 是什么,它在哪里初始化?如果nap-&gt;read_bufferchar 数组,那么这当然行不通。如果你做'a'-&gt;sem_handle,你期望结果是什么?
  • 为什么这样:SharedStruct* res= malloc(nb *sizeof(SharedStruct)); ?我会说:result[i] = malloc(sizeof(SharedStruct)); + 戈登贝利所说的
  • 请显示调用 create_buffer 的代码。
  • 您不知道第一个 fprintf 失败了,因为它可能正在缓冲字符串而不是在程序结束之前打印它。此外,您没有显示nap 的分配。

标签: c pointers constructor segmentation-fault


【解决方案1】:

我没有看到您初始化包含在结果中的指针。您刚刚为它们分配了空间,似乎您忘记在循环中执行 result[i]=res。

【讨论】:

    【解决方案2】:

    首先。代码要正确缩进,否则无法阅读自己的代码。

    接下来,您将 result 初始化为 nb 条目的数组,而根本不对其进行初始化。

    接下来,您分配nb 乘以指向 (SharedStruct*) 的指针,并为每个此类结构分配一个缓冲区,该缓冲区不会保留在任何地方,因此以后无法释放它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 2013-09-12
      相关资源
      最近更新 更多