我正在尝试使用我在线程函数内的main函数中分配的内存,但是我收到了错误:undefined reference to 'product_line'
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include "test1.c"
int main()
{
char** product_line;
product_line = malloc(sizeof(char *));
product_line[0] = "Toy";
product_line[1] = "Chair";
product_line[2] = "Door";
pthread_t thread_tid;
pthread_create(&thread_tid, NULL, foo, NULL);
pthread_join(thread_tid, NULL);
return 0;
}
这是线程调用的独立源:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
extern char** product_line;
void * foo(void *param)
{
int i;
printf("%s\n", product_line[0]);
for (i = 0; i < 3; i++)
printf("%s\n", product_line[i]);
}
如何解决此错误?
答案 0 :(得分:4)
变量product_line
应在main
之外声明,否则无法从其他翻译单元访问:
/* main.c */
…
char **product_line;
int main()
{
…
}
MikeCAT提到的另一个问题:
包括
.c
源文件是不寻常的。
考虑添加标头文件test1.h
:
/* test1.h */
#ifndef TEST1_H
#define TEST1_H
void * foo(void *param);
#endif
然后,将#include "test1.c"
中的main.c
替换为:
#include "test1.h"
当编译foo
和main.c
时,需要避免重复定义test1.c
。 (假设您使用类似于cc main.c test1.c
的内容编译代码。)建议(尽管是可选的)在test1.h
中也包含test1.c
。
Martin James也提到:
您为一个指针分配空间,然后使用其中三个:((
这一行
product_line = malloc(sizeof(char *));
为单个char *
指针分配空间。但是,您实际上正在使用其中的3个,因此您需要分配3个char *
指针:
product_line = malloc(sizeof(char *) * 3);
答案 1 :(得分:3)
product_line
的定义无法访问,因为它是局部变量,而不是全局变量。
使product_line
全球化是一种简单的解决方法。
另一种解决方案是将product_line
作为参数传递。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void * foo(void *param)
{
char** product_line = param;
int i;
printf("%s\n", product_line[0]);
for (i = 0; i < 3; i++)
printf("%s\n", product_line[i]);
return NULL;
}
int main(void)
{
const char** product_line; /* strings literals are not modifyable */
product_line = malloc(sizeof(const char *) * 3); /* Do allocate enough buffer! */
if (product_line == NULL) /* You should check if malloc() was successful. */
{
perror("malloc");
return 1;
}
product_line[0] = "Toy";
product_line[1] = "Chair";
product_line[2] = "Door";
pthread_t thread_tid;
pthread_create(&thread_tid, NULL, foo, product_line);
pthread_join(thread_tid, NULL);
free(product_line); /* You should free() what you allocatted via malloc(). */
return 0;
}
答案 2 :(得分:1)
您应该知道本地(自动)变量和全局变量之间的区别。
以下链接中的变量范围: http://www.tutorialspoint.com/cprogramming/c_scope_rules.htm
如果您阅读上一个教程,您将能够自己检测错误。 product_line
变量为auto,这意味着一旦您输入&#34; main&#34;它就会在堆栈区域中创建。通过摆脱它来实现并摧毁它。
因此,此变量不适用于foo
函数;不在它的堆栈上。
建议的解决方案:
制作一个可用于所有功能的全局指针
为foo
函数添加新参数并将此指针传递给它。
注意:强>
包含.c文件,包含.h而不是常见的,它包含原型和此模块的已定义类型。