gpt4 book ai didi

c - 未知的段错误可能与内存分配有关

转载 作者:太空宇宙 更新时间:2023-11-04 03:53:02 24 4
gpt4 key购买 nike

在搜索了很多关于类似问题的线程后,我一直无法确定为什么我的程序会出现段错误。我有两个文件:buffer.c,我在其中创建一个循环缓冲区并从中存入/删除值,还有一个主文件,其中多个线程使用用户输入调用循环缓冲区上的操作。信号量用于防止并发访问。

以下是我的主程序的相关部分:

int main (int argc, char const *argv[]) {
st_init();
Buffer *bufferA,*bufferB,*bufferC;
createBuffer(bufferA,128);
createBuffer(bufferB,128);
createBuffer(bufferC,128);
// Create the struct used to initialize threads.
ThreadInit initA = {
bufferA,
bufferA
};
ThreadInit initB = {
bufferA,
bufferB
};
ThreadInit initC = {
bufferB,
bufferC
};
ThreadInit initD = {
bufferC,
bufferC
};
// Create threads
if (st_thread_create(getInputStream, &initA, 0, 0) == NULL) {
perror("Thread a creation failure.");
exit(EXIT_FAILURE);
}

if (st_thread_create(convertCR, &initB, 0, 0) == NULL) {
perror("Thread b creation failure.");
exit(EXIT_FAILURE);
}
if (st_thread_create(squashChar, &initC, 0, 0) == NULL) {
perror("Thread c creation failure.");
exit(EXIT_FAILURE);
}
if (st_thread_create(printOutput, &initD, 0, 0) == NULL) {
perror("Thread d creation failure.");
exit(EXIT_FAILURE);
}

// Exit from main via ST.
st_thread_exit(NULL);
return 0;

}

void *getInputStream(void *state) {
ThreadInit *threadInit = state;
char inputChar = getchar();
while (inputChar != EOF) {
deposit(inputChar, threadInit->produceBuff); //where segfault occurs
inputChar = getchar();
st_usleep(SLEEP_TIME);
}
st_thread_exit(NULL);
}

和buffer.c

void createBuffer(Buffer *buff, int buffSize){
buff = (Buffer*) calloc(1, sizeof(Buffer));
semaphore mutex,emptyBuffers,fullBuffers;

buff->mutex = calloc(1,sizeof(semaphore));
buff->emptyBuffers = calloc(1,sizeof(semaphore));
buff->fullBuffers = calloc(1,sizeof(semaphore));

createSem(buff->mutex,1);
createSem(buff->emptyBuffers,buffSize);
createSem(buff->fullBuffers,0);

buff->charBuff = malloc(sizeof(char) * buffSize);
buff->nextIn = 0;
buff->nextOut = 0;
buff->buffSize = buffSize;
}

第一次对我的缓冲区中的信号量进行操作时会发生段错误,这让我相信它们的内存分配不当,尽管我包含了来自 main 的代码以防我的假设错了。另外,如果我的代码不清楚,我是 C 的新手,所以我很感激任何指导。谢谢!

最佳答案

这里是错误

void createBuffer(Buffer *buff, int buffSize){
buff = (Buffer*) calloc(1, sizeof(Buffer));

您需要返回缓冲区的指针,否则您不会将更改后的指针返回给调用者

void createBuffer(Buffer **buff, int buffSize){
*buff = calloc(1, sizeof(Buffer));

有点简化:它类似于

int foo(int a)
{
a = 1; // 1 not visible outside foo
}

int foo(int *a)
{
*a = 1; // 1 is visible outside foo
}

同样在 C 中,您不会强制转换从 calloc/malloc 返回的内容仅当您使用 C++ 编译器进行编译时才应使用 new相反

关于c - 未知的段错误可能与内存分配有关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19310184/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com