Major changes: //-------->
Minor changes: //
#include <stdio.h>
#include <stdlib.h>
struct TreeNode
{
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
};
void nodesVal(struct TreeNode *root, int *returnSize, int **returnArray)
{
    if (root != NULL)
    {
        //-------> (*returnArray)[0] instead of *returnArray[0] ----> [] has higher priority than *
        // I changed the order of those two lines so that I don't say size++ and then use size-1 (you can ignore this)
        (*returnArray)[*(returnSize)] = root->val;
        *(returnSize) = *(returnSize) + 1;
        // when you enter this, you already check for NULL, so I removed (if) --- However, this can be ignored
        nodesVal(root->left, returnSize, returnArray);
        nodesVal(root->right, returnSize, returnArray);
    }
}
int *preorderTraversal(struct TreeNode *root, int *returnSize)
{
    int *returnArray = (int *)malloc(sizeof(int) * 100);
    *returnSize = 0;
    // ---------> you were passing &returnSize (int**). However, the function needs (int*). So, pass returnSize
    nodesVal(root, returnSize, &returnArray);
    return returnArray;
}
void constructNode(struct TreeNode**root,struct TreeNode*left,struct TreeNode* right,int val){
    (*root)->left = left;
    (*root)->right = right;
    (*root)->val = val;
}
int main()
{
    struct TreeNode*root = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    struct TreeNode*node1 = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    struct TreeNode*node2 = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    struct TreeNode*node3 = (struct TreeNode*)malloc(sizeof(struct TreeNode));
    constructNode(&root,node1,node2,1);
    constructNode(&node1,node3,NULL,2);
    constructNode(&node2,NULL,NULL,3);
    constructNode(&node3,NULL,NULL,4);
    int* returnedSize = malloc(sizeof(int));
    int* arr = preorderTraversal(root,returnedSize);
    for (int i = 0; i < *returnedSize; i++)
    {
        printf("%d ",arr[i]);
    }
    printf("\n");
    free(arr);
    free(returnedSize);
    free(root);
    free(node1);
    free(node2);
    free(node3);
    return 0;
}