指针问题和动态分配内存

时间:2017-07-02 08:19:44

标签: c arrays function pointers

我正在进行一项练习,最终将变成用于教育目的的pthread实验。在这里,我正在列出一个列表(字母表)并尝试获取五个数字列表,我可以将它们提供给pthread来分析某些内容。例如,numList = 0 5 10 15 20 25,在字母表的情况下。最后,我将对其进行设置,以便pthread将获取该列表并将列表中这些位置的元素与另一个元素进行比较。我创建了一个divList函数来尝试返回上面的列表,以便我可以使用它。虽然我在函数中得到了正确的结果,但我没有将列表返回到main。我处理指针和函数的方式有明显的错误吗?

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <pthread.h>

#define num_threads 5

/* Global variable: accessible to all threads */
char *list = "abcdefghijklmnopqrstuvwxyz";
/* ----------------------------------------- */

int *divList(int MAX, int pos);
void* Hello(void* rank); /* Thread Function */

int main(int argc, char *argv[])
{
    int i, n, thread;
    pthread_t* thread_handles;

    n = strlen(list);
    for (i = 0; i < num_threads; i++){
        if (i <= n % num_threads) // str length / 5 ... remainder 
             //  = 0, 1, 2, 3, 4 
            printf("elements: %d\n", divList(n + 1, i));
        else{
            printf("elements: %d\n", divList(n, i));
        }
    }

    thread_handles = malloc (num_threads*sizeof(pthread_t));

    for (thread = 0; thread < num_threads; thread++){
        pthread_create(&thread_handles[thread], NULL, Hello, 
         (void*) thread);
    }

    printf("Hello from the main thread\n");

    for (thread = 0; thread < num_threads; thread++)
        pthread_join(thread_handles[thread], NULL);
    free(thread_handles);
    return 0;   
}   /* MAIN */

int *divList(int MAX, int pos)
{
    int i = 0, j;
    int *numList = malloc(MAX + 1);

    for (j = pos; j < MAX; (j = j + num_threads)){
        numList[i] = j;
        printf("test list: %d\n", numList[i]);
        i++;
    }
    return numList;
}

void* Hello(void* rank) {
    int my_rank = (int) rank; 
    printf("Hello from  thread %d of %d\n", my_rank, num_threads);

    return NULL;
}   /* Hello */

2 个答案:

答案 0 :(得分:1)

divList()返回指向int数组的第1个元素的指针,其元素数等于传入devList()的元素作为第一个参数加1,下面是代码存储在plist

要访问这些值,您可以将指针视为数组,例如循环以打印其值:

void printList(int * plist, size_t s)
{
  for (size_t i = 0; i < s; ++i)
  {
    printf("element[%zu]: %d\n", i, plist[i];
  }
}

int main(int argc, char *argv[])
{
  int i, n, thread;
  int *plist = NULL;
  pthread_t *thread_handles;

  n = strlen(list);
  for (i = 0; i < num_threads; i++)
  {
    if (i <= n % num_threads)  
    {
      plist = divList(n + 1, i);
      printList(plist, n + 1);  /* divList allocates one more then needed 
                                   but never initialises it, so do not print it. */
    }
    else
    {
      ..

答案 1 :(得分:0)

您的divList函数返回int *,您将返回值视为int(您使用%d打印它)。您应该将返回的值保存在变量中,因为您在使用它之后应该释放该内存(每次调用divList都会分配内存,而且目前您没有释放它。)

我不确定你想用divList给出的数字到底是什么,但是这里是你如何访问列表中的元素:

int *arr = divList(n+1, i);
printf("%d\n", arr[5]);