调了半天才搞定,其中问题之一是把下标增量声明为int,导致溢出。(char为1字节,int为4字节)。还有可能调用malloc后产生的指针最好不要使用吧?反正书上是直接赋给另外一个指针变量。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main() {
char *str;
char *str1;
str = malloc(100 * sizeof(char));
str1 = str;
strcpy_s(str1, 100, "hello world!");
printf("%s\n", str1);
free(str);
}
竟然还需要拷贝才能进去,不能直接等于,厄,没想到存个字符串这么麻烦呀,不知道有没有其他好的方法。使用strcpy_s的话str指针并不会偏移:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main() {
char *str;
str = malloc(100 * sizeof(char));
strcpy_s(str, 100, "hello world!");
printf("%s\n", str);
free(str);
}
其实也可以使用下标给字符串赋值,或者使用+号进行偏移:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main() {
char *str;
char *str1 = "hello world!";
int i;
str = malloc(100 * sizeof(char));
for (i = 0; str1[i] != '\0'; i++) {
str[i] = str1[i];
}
str[i] = '\0';
printf("%s\n", str);
free(str);
}
或者:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
main() {
char *str;
char *str1 = "hello world!";
int i;
str = malloc(100 * sizeof(char));
for (i = 0; str1[i] != '\0'; i++) {
*(str + i) = str1[i];
}
*(str + i) = '\0';
printf("%s\n", str);
free(str);
}
另外一个动态分配内存的例子,写了半个小时:
/**
* 获取用户输入的字符串,打印行号
* skchen @ 2009.08.29 03:03
*/
#include <stdio.h>
#include <stdlib.h>
#define MEM_SIZE 100
void main() {
//行号
int line_num = 1;
//行字符数
int char_num = 1;
//行指针
char *line = NULL;
//用户输入的字符
char c;
//已分配内存大小
int total_mem_size = 0;
while ((c = getchar()) != EOF && c != '\n') {
do {
//看看内存空间是否足够用,要留一位给\0
if (total_mem_size < char_num) {
//分配扩大内存空间
line = realloc(line, total_mem_size + MEM_SIZE);
if (line == NULL) {
printf("动态内存分配错误!程序退出!\n");
exit(EXIT_FAILURE);
}
//如果分配成功,内存总分配大小加上去
total_mem_size += MEM_SIZE;
}
//把字符给数组
line[char_num - 1] = c;
char_num++;
//继续获取字符
c = getchar();
//判断是否回车,如果不是则未结束,继续循环
} while (c != '\n');
//添加字符串结束符
line[char_num - 1] = '\0';
//打印结果
printf("line: %d, length: %d, size: %d, string: %s\n", line_num, char_num, total_mem_size, line);
//释放内存
free(line);
//指针重新置为NULL
line = NULL;
//内存大小置为0
total_mem_size = 0;
//字符长度初始化为1
char_num = 1;
//行号+1
line_num++;
}
exit(EXIT_SUCCESS);
}
VN:F [1.9.3_1094]
Rating: 8.8/10 (5 votes cast)
VN:F [1.9.3_1094]
Rating: +1 (from 5 votes)