代码中先申请了一块内存, 应该不存在内存越界问题,但第二个malloc申请内存是总是core dump/
网上查到, 若之前内存被越界过, 后面的malloc可能就会失败。http://blog.csdn.net/bigapple88/article/details/5693489
但我写的代码应该没有这个问题。
源代码如下:
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
4 #include <assert.h>
5 #include <errno.h>
6
7 char* str1;
8 char* str2;
9
10 int* matrix;
11 int len1;
12 int len2;
13
14 int get_max_len(int x, int y, int* start)
15 {
16 int max_len;
17 int cur_len;
18 int x0 = -1;
19
20 *start = -1;
21 max_len = 0;
22 cur_len = 0;
23
24 while(x<len1 && y<len2)
25 {
26 if (! matrix[x*len1+y])
27 {
28 cur_len++;
29
30 if (-1 == x0)
31 x0 = x;
32 }
33 else
34 {
35 if (x0 != -1 && x-x0 > max_len)
36 {
37 cur_len = x-x0;
38 *start = x0;
39 x0 = -1;
40 }
41 }
42
43 if (max_len < cur_len)
44 {
45 *start = x0;
46 max_len = cur_len;
47 }
48
49 ++x, ++y;
50 }
51
52 return max_len;
53 }
54
55
56 int main(int argc, char* argv[])
57 {
58 int i, j;
59 int cur_len;
60 int max_len, s;
61 int start;
62 extern int errno;
63 char* sub_str;
64
65 if (argc != 3)
66 {
67 printf("pls input two strs: \n");
68 return 0;
69 }
70
71 cur_len = 0;
72 max_len = 0;
73 start = 0;
74 s = -1;
75 max_len = 0;
76 int offset = 0;
77
78 str1 = argv[1];
79 str2 = argv[2];
80
81 len1 = strlen(str1);
82 len2 = strlen(str2);
83
84 matrix = (int*) malloc(sizeof(int) * (1+len1 * len2));
85
86 for (i = 0; i < len1; i++)
87 {
88 for (j = 0; j < len2; j++)
89 {
90 matrix[i*len1+j] = str1[i] - str2[j];
91 }
92 }
93
94 for (i = 0; i < len1; i++)
95 {
96 cur_len = get_max_len(i, 0, &s);
97
98 if (cur_len > max_len)
99 {
100 start = s;
101 max_len = cur_len;
102 }
103 }
104
105 for (i = 0; i < len2; i++)
106 {
107 cur_len = get_max_len(0, i, &s);
108
109 if (cur_len > max_len)
110 {
111 start = s;
112 max_len = cur_len;
113 }
114 }
115
116 free(matrix);
117
118 sub_str = (char*)malloc(max_len+1); // 如果之前的malloc不 +1 在ubuntu上总是提示越界coredump,但在fedora没问题。
119 strncpy(sub_str, str1+start, max_len);
120 sub_str[max_len] = '\0';
121
122 printf("max substr is %s\n", sub_str);
123
124 return 0;
125 }
126