释放阵列时出现分段错误(堆芯转储) #包括 #包括 #包括 int main(int argc,char*argv[]) { /* 来自命令行的参数: N:每个元组的维数 M:属性的最大可能数量 一个元组可以 */ int N,M; N=atoi(argv[1]); M=atoi(argv[2]); //Ln存储属性范围从0到Ln[i]-1; int*Ln=(int*)malloc(N); //int-Ln[N]; //printf(“N:%d,M:%d\N”,N,M); /* 生成文件“repo_file.txt”的参数 */ inti,seed,p1,p2,p3; 种子=时间(空); p1=762;p2=8196;p3=9765; 对于(i=0;i

释放阵列时出现分段错误(堆芯转储) #包括 #包括 #包括 int main(int argc,char*argv[]) { /* 来自命令行的参数: N:每个元组的维数 M:属性的最大可能数量 一个元组可以 */ int N,M; N=atoi(argv[1]); M=atoi(argv[2]); //Ln存储属性范围从0到Ln[i]-1; int*Ln=(int*)malloc(N); //int-Ln[N]; //printf(“N:%d,M:%d\N”,N,M); /* 生成文件“repo_file.txt”的参数 */ inti,seed,p1,p2,p3; 种子=时间(空); p1=762;p2=8196;p3=9765; 对于(i=0;i,c,C,您没有分配正确的字节数: #include <stdio.h> #include <stdlib.h> #include <time.h> int main(int argc, char * argv[]) { /* arguments from command line: N: dimension of each tuple M: maximum possible number of attribut

您没有分配正确的字节数:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char * argv[])
{
    /*
        arguments from command line:
        N: dimension of each tuple
        M: maximum possible number of attributes
            a tuple can take
    */
    int N,M;
    N = atoi(argv[1]);
    M = atoi(argv[2]);

    // Ln store attribute range from 0 to Ln[i]-1;
    int * Ln = (int *)malloc(N);
    //int Ln[N];
    //printf("N: %d, M: %d\n",N,M);
    /*
        to generate parameters to file "repo_file.txt"
    */

    int i,seed,p1,p2,p3;
    seed = time(NULL);
    p1 = 762; p2 = 8196; p3 = 9765;
    for(i=0;i<N;i++)
    {
        seed  = (p1*seed+p2)%p3;
        srand(seed);
        Ln[i] = (rand()%M+1);
        printf("%dth element: %d \n",i,Ln[i]);
    }

   free(Ln);
   return 0;
}
N
以字节为单位,您应该使用
N*sizeof*Ln


另请注意,.

您没有分配正确的字节数:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char * argv[])
{
    /*
        arguments from command line:
        N: dimension of each tuple
        M: maximum possible number of attributes
            a tuple can take
    */
    int N,M;
    N = atoi(argv[1]);
    M = atoi(argv[2]);

    // Ln store attribute range from 0 to Ln[i]-1;
    int * Ln = (int *)malloc(N);
    //int Ln[N];
    //printf("N: %d, M: %d\n",N,M);
    /*
        to generate parameters to file "repo_file.txt"
    */

    int i,seed,p1,p2,p3;
    seed = time(NULL);
    p1 = 762; p2 = 8196; p3 = 9765;
    for(i=0;i<N;i++)
    {
        seed  = (p1*seed+p2)%p3;
        srand(seed);
        Ln[i] = (rand()%M+1);
        printf("%dth element: %d \n",i,Ln[i]);
    }

   free(Ln);
   return 0;
}
N
以字节为单位,您应该使用
N*sizeof*Ln


作为旁注,.

您没有为
Ln
数组分配足够的空间。您只分配
N
字节,而不是
N
整数的空间。因此,您的循环将经过数组的末尾

使用:


您没有为
Ln
数组分配足够的空间。您只为
N
字节分配空间,而不是为
N
整数分配空间。因此,您的循环将经过数组的末尾

使用:


@KeithRandall关于你的编辑。我真正的意思是
sizeof*Ln
而不是
sizeof(*Ln)
sizeof
操作数之间的参数仅在操作数是类型名称时才需要,而不是表达式时才需要。确实,它们不是必需的,只是为了增加一些清晰度。@KeithRandall关于您的编辑。我真正的意思是
sizeof*Ln
而不是
sizeof(*Ln)
。只有当操作数是类型名时,而不是表达式时,才需要操作数的大小之间的参数。如果是,则不需要这些参数,只是为了增加清晰度。
int *Ln = malloc(N * sizeof(int));