分段错误C:malloc(sizeof(char *)* 3)

时间:2014-06-20 15:54:23

标签: c multithreading

问题: 将带有char * memoria的struct传递给一个线程 分段错误

代码: main.c中

 memoria=malloc(sizeof(char*)*3);
 ...
 parametri_thread_ram[0].memoria = (char*)memoria;

funzioni.h

struct thread_cpu {
int *i;
int *numCpu;
char *memoria;
};

cpu.c

   my_data = (struct thread_cpu*) thread_arg;
   memoria = (intptr_t)my_data -> memoria;
   ...
   memoria[0] = buffer[0]; //buffer[0]='W'
   sprintf(help,"%d",operandi[0]);
   memoria[1] = help; help='2'   <------------------segmentation fault
   sprintf(help,"%d",operandi[1]);
   memoria[2] = help; help='4'

2 个答案:

答案 0 :(得分:1)

首先,memoria声明的大小错误;它应该是:

memoria=malloc(sizeof(char)*3);

否则它将是char的三个指针的大小(通常更大)。

其次,因为你正在使用sprintf(),所以你需要help作为一个足够大的char缓冲区,例如:

char help[20];

然后,假设您只想将第一个字符存储在memoria

sprintf(help, ...)
memoria[1] = help[0];
sprintf(help, ...)
memoria[2] = help[0];

顺便说一下,上述大多数问题都应该在编译过程中出现(使用gcc -Wall)。

答案 1 :(得分:0)

你的问题非常神秘。您确实应该包含完整的代码,而不是让我们尝试对您的代码进行反向工程。无论如何,我们有:

help='2';

这意味着help的类型为char

我们也有:

sprintf(help, "%d", operandi[0]);

仅当help指向足够大的内存块以接收您生成的字符串时,此操作才有效。显然情况并非如此。

其余代码看起来也非常粗略。我不明白为什么要为3 char*指针分配内存。而且我不明白为什么你需要在类型系统之外做所有这些。您最好尝试删除尽可能多的强制转换并让编译器帮助您。编译器随时为您提供帮助,并且您正在停止使用您的转换。