user-0 提问: C语言编程出现这个问题！求大家帮忙看看是怎么回事~谢谢了program stopped at 0x4015c4.It stopped with signal S

回复:
user: user-0
content: 引用 8 楼 jjaisgm 的回复:[quote=引用 7 楼 user-2 的回复:] [quote=引用 6 楼 jjaisgm 的回复:] [quote=引用 5 楼 user-2 的回复:] [quote=引用 4 楼 jjaisgm 的回复:] [quote=引用 3 楼 user-2 的回复:] 使用堆内存越界了  T.mat[i] = (char *)malloc(n*sizeof(char)); 运行到这里你的n为1，也就是只分配了一个字符的大小     空间分配不够[/quote]  引用 5 楼 user-2 的回复:[quote=引用 4 楼 jjaisgm 的回复:] [quote=引用 3 楼 user-2 的回复:] 使用堆内存越界了  T.mat[i] = (char *)malloc(n*sizeof(char)); 运行到这里你的n为1，也就是只分配了一个字符的大小  请问应该怎么改呢？这不就是在用malloc分配内存空间么？谢谢您~[/quote]  空间分配不够[/quote]   那 T.mat= (char**)malloc(m*sizeof(char*)*128);  是这样扩大内存空间么？[/quote]  我说是T.mat[i]那句，不是T.mat  你可以自己单步跟踪程序运行分析原因[/quote]  您好,我还是没弄明白`````我内存分配这里学的很不好,请问您能否详细的帮我解释一下呢?谢谢您了!

user: user-0
content: 引用 11 楼 jjaisgm 的回复:[quote=引用 10 楼 cfjtaishan 的回复:] # include <stdio.h> # include <string.h> # include <malloc.h>  typedef struct {     char **mat;     int m, n; }martix;  void initial(martix &T,int m,int n) {     int i;     T.mat= (char**)malloc(m * sizeof(char*));      for(i = 0; i < m; i++)     {         T.mat[i] = (char *)malloc(n*sizeof(char));     }     T.m = m;     T.n = n; }  void initZero(martix &T,int m,int n) {     int i,j;      initial(T, m, n);      for(i = 0; i < m; i++)     {         for(j = 0; j < n; j++)         {             T.mat[i][j]=0;         }     } }  void destroy(martix T) {     int i;      for(i = 0; i < T.m; i++)         free(T.mat[i]);     free(T.mat); }    int main() {     int i, j, k, n;     int clen, klen;      char ciphertext[100];     char key[200];      martix T;        printf("请输入明文：\n");     scanf("%s", ciphertext);     printf("请输入密钥：\n");     scanf("%s", key);      clen = strlen(ciphertext);     klen = strlen(key);      if(clen % klen == 0)         k = clen / klen;     else         k = clen / klen + 1;      printf("clen = %d\t, klen = %d, k = %d\n", clen, klen, k);     //initial(T, k, klen);  /* swap second param with the third*/     initZero(T, k,  klen); /* swap second param with the third*/      strcat(key, ciphertext);     printf("%s\n",key);      for(i = 0; i < k; i++)     {         for(j = 0; j < klen; j++)         {             n = i * klen + j;             T.mat[i][j] = key[n];             printf("%c ", T.mat[i][j]);         }         printf("\n");     }     destroy(T);      return 0; }  用这个吧，上面那个还有点瑕疵[/  您好.这个代码我试了,还是不能正常运行,会出现却结果的现象,而且还会停止运行````其实我想知道怎么能扩大分配的内存,感觉我分配多大的内存空间都不够````

user: user-0
content: [quote=引用 10 楼 cfjtaishan 的回复:] # include <stdio.h> # include <string.h> # include <malloc.h>  typedef struct {     char **mat;     int m, n; }martix;  void initial(martix &T,int m,int n) {     int i;     T.mat= (char**)malloc(m * sizeof(char*));      for(i = 0; i < m; i++)     {         T.mat[i] = (char *)malloc(n*sizeof(char));     }     T.m = m;     T.n = n; }  void initZero(martix &T,int m,int n) {     int i,j;      initial(T, m, n);      for(i = 0; i < m; i++)     {         for(j = 0; j < n; j++)         {             T.mat[i][j]=0;         }     } }  void destroy(martix T) {     int i;      for(i = 0; i < T.m; i++)         free(T.mat[i]);     free(T.mat); }    int main() {     int i, j, k, n;     int clen, klen;      char ciphertext[100];     char key[200];      martix T;        printf("请输入明文：\n");     scanf("%s", ciphertext);     printf("请输入密钥：\n");     scanf("%s", key);      clen = strlen(ciphertext);     klen = strlen(key);      if(clen % klen == 0)         k = clen / klen;     else         k = clen / klen + 1;      printf("clen = %d\t, klen = %d, k = %d\n", clen, klen, k);     //initial(T, k, klen);  /* swap second param with the third*/     initZero(T, k,  klen); /* swap second param with the third*/      strcat(key, ciphertext);     printf("%s\n",key);      for(i = 0; i < k; i++)     {         for(j = 0; j < klen; j++)         {             n = i * klen + j;             T.mat[i][j] = key[n];             printf("%c ", T.mat[i][j]);         }         printf("\n");     }     destroy(T);      return 0; }  用这个吧，上面那个还有点瑕疵[/   非常感谢您!我学习学习您的代码再来请教!

user: user-1
content: # include <stdio.h> # include <string.h> # include <malloc.h>  typedef struct {     char **mat;     int m, n; }martix;  void initial(martix &T,int m,int n) {     int i;     T.mat= (char**)malloc(m * sizeof(char*));      for(i = 0; i < m; i++)     {         T.mat[i] = (char *)malloc(n*sizeof(char));     }     T.m = m;     T.n = n; }  void initZero(martix &T,int m,int n) {     int i,j;      initial(T, m, n);      for(i = 0; i < m; i++)     {         for(j = 0; j < n; j++)         {             T.mat[i][j]=0;         }     } }  void destroy(martix T) {     int i;      for(i = 0; i < T.m; i++)         free(T.mat[i]);     free(T.mat); }    int main() {     int i, j, k, n;     int clen, klen;      char ciphertext[100];     char key[200];      martix T;        printf("请输入明文：\n");     scanf("%s", ciphertext);     printf("请输入密钥：\n");     scanf("%s", key);      clen = strlen(ciphertext);     klen = strlen(key);      if(clen % klen == 0)         k = clen / klen;     else         k = clen / klen + 1;      printf("clen = %d\t, klen = %d, k = %d\n", clen, klen, k);     //initial(T, k, klen);  /* swap second param with the third*/     initZero(T, k,  klen); /* swap second param with the third*/      strcat(key, ciphertext);     printf("%s\n",key);      for(i = 0; i < k; i++)     {         for(j = 0; j < klen; j++)         {             n = i * klen + j;             T.mat[i][j] = key[n];             printf("%c ", T.mat[i][j]);         }         printf("\n");     }     destroy(T);      return 0; }  用这个吧，上面那个还有点瑕疵

user: user-1
content: # include <stdio.h> # include <string.h> # include <malloc.h>  typedef struct {     char **mat;     int m, n; }martix;  void initial(martix &T,int m,int n) {     int i;     T.mat= (char**)malloc(m * sizeof(char*));      for(i = 0; i < m; i++)     {         T.mat[i] = (char *)malloc(n*sizeof(char));     }     T.m = m;     T.n = n; }  void initZero(martix &T,int m,int n) {     int i,j;      initial(T, m, n);      for(i = 0; i < m; i++)     {         for(j = 0; j < n; j++)         {             T.mat[i][j]=0;         }     } }  void destroy(martix *T) {     int i;      for(i = 0; i < T->m; i++)         free(T->mat[i]);     free(T->mat); }    int main() {     int i, j, k, n;     int clen, klen;      char ciphertext[100];     char key[200];      martix T;        printf("请输入明文：\n");     scanf("%s", ciphertext);     printf("请输入密钥：\n");     scanf("%s", key);      clen = strlen(ciphertext);     klen = strlen(key);      if(clen % klen == 0)         k = clen / klen;     else         k = clen / klen + 1;      printf("clen = %d\t, klen = %d, k = %d\n", clen, klen, k);     //initial(T, k, klen);  /* swap second param with the third*/     initZero(T, k,  klen); /* swap second param with the third*/      strcat(key, ciphertext);     printf("%s\n",key);      for(i = 0; i < k; i++)     {         for(j = 0; j < klen; j++)         {             n = i * klen + j;             T.mat[i][j] = key[n];             printf("%c ", T.mat[i][j]);         }         printf("\n");     }     destroy(T);      return 0; }  两个问题： 1.输入明文和密码时，把前面的&去掉，数组名本身就是地址； 2.交换一下initZero函数后两个实参的位置，注意申请空间的时候先申请的是行数，后申请的是列。不交换就会出现越界； 另外，改了一下两个变量名。i,j是用于作为循环变量的。在main函数里初始化操作不用调用，因为在初始化0时会先初始化。

user: user-0
content: 引用 7 楼 user-2 的回复:[quote=引用 6 楼 jjaisgm 的回复:] [quote=引用 5 楼 user-2 的回复:] [quote=引用 4 楼 jjaisgm 的回复:] [quote=引用 3 楼 user-2 的回复:] 使用堆内存越界了  T.mat[i] = (char *)malloc(n*sizeof(char)); 运行到这里你的n为1，也就是只分配了一个字符的大小  请问应该怎么改呢？这不就是在用malloc分配内存空间么？谢谢您~[/quote]  空间分配不够[/quote]  引用 5 楼 user-2 的回复:[quote=引用 4 楼 jjaisgm 的回复:] [quote=引用 3 楼 user-2 的回复:] 使用堆内存越界了  T.mat[i] = (char *)malloc(n*sizeof(char)); 运行到这里你的n为1，也就是只分配了一个字符的大小  请问应该怎么改呢？这不就是在用malloc分配内存空间么？谢谢您~[/quote]  空间分配不够[/quote]   那 T.mat= (char**)malloc(m*sizeof(char*)*128);  是这样扩大内存空间么？[/quote]  我说是T.mat[i]那句，不是T.mat  你可以自己单步跟踪程序运行分析原因[/quote]  嗯嗯~我再仔细看看~真的很感谢您~

user: user-2
content: 引用 6 楼 jjaisgm 的回复:[quote=引用 5 楼 user-2 的回复:] [quote=引用 4 楼 jjaisgm 的回复:] [quote=引用 3 楼 user-2 的回复:] 使用堆内存越界了  T.mat[i] = (char *)malloc(n*sizeof(char)); 运行到这里你的n为1，也就是只分配了一个字符的大小  请问应该怎么改呢？这不就是在用malloc分配内存空间么？谢谢您~[/quote]  空间分配不够[/quote]  引用 5 楼 user-2 的回复:[quote=引用 4 楼 jjaisgm 的回复:] [quote=引用 3 楼 user-2 的回复:] 使用堆内存越界了  T.mat[i] = (char *)malloc(n*sizeof(char)); 运行到这里你的n为1，也就是只分配了一个字符的大小  请问应该怎么改呢？这不就是在用malloc分配内存空间么？谢谢您~[/quote]  空间分配不够[/quote]   那 T.mat= (char**)malloc(m*sizeof(char*)*128);  是这样扩大内存空间么？[/quote]  我说是T.mat[i]那句，不是T.mat  你可以自己单步跟踪程序运行分析原因

user: user-0
content: 引用 5 楼 user-2 的回复:[quote=引用 4 楼 jjaisgm 的回复:] [quote=引用 3 楼 user-2 的回复:] 使用堆内存越界了  T.mat[i] = (char *)malloc(n*sizeof(char)); 运行到这里你的n为1，也就是只分配了一个字符的大小  请问应该怎么改呢？这不就是在用malloc分配内存空间么？谢谢您~[/quote]  空间分配不够[/quote]  引用 5 楼 user-2 的回复:[quote=引用 4 楼 jjaisgm 的回复:] [quote=引用 3 楼 user-2 的回复:] 使用堆内存越界了  T.mat[i] = (char *)malloc(n*sizeof(char)); 运行到这里你的n为1，也就是只分配了一个字符的大小  请问应该怎么改呢？这不就是在用malloc分配内存空间么？谢谢您~[/quote]  空间分配不够[/quote]   那 T.mat= (char**)malloc(m*sizeof(char*)*128);  是这样扩大内存空间么？

user: user-2
content: 引用 4 楼 jjaisgm 的回复:[quote=引用 3 楼 user-2 的回复:] 使用堆内存越界了  T.mat[i] = (char *)malloc(n*sizeof(char)); 运行到这里你的n为1，也就是只分配了一个字符的大小  请问应该怎么改呢？这不就是在用malloc分配内存空间么？谢谢您~[/quote]  空间分配不够

user: user-0
content: 引用 3 楼 user-2 的回复:使用堆内存越界了  T.mat[i] = (char *)malloc(n*sizeof(char)); 运行到这里你的n为1，也就是只分配了一个字符的大小  请问应该怎么改呢？这不就是在用malloc分配内存空间么？谢谢您~

user: user-2
content: 使用堆内存越界了  T.mat[i] = (char *)malloc(n*sizeof(char)); 运行到这里你的n为1，也就是只分配了一个字符的大小

user: user-0
content: 通过debug，我发现出错位置在 在第二次大循环结束后，就崩掉了····求大神们指点！！！

user: user-0
content: 这是错误弹出的的对话框