问题: 将带有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'
答案 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*
指针分配内存。而且我不明白为什么你需要在类型系统之外做所有这些。您最好尝试删除尽可能多的强制转换并让编译器帮助您。编译器随时为您提供帮助,并且您正在停止使用您的转换。